Django Queryset - 如何使用 prefetch_related 对相关模型进行数学运算?

Django Queryset - How do I do math on related models with prefetch_related?

我有三个模型:

class Variety(models.Model)
    name = models.CharField(max_length=24)

class Item(models.Model)
    name = models.CharField(max_length=24)
    in_stock = models.IntegerField()

class ItemPart(models.Model)        
    variety = models.ForeignKey(Variety)
    product = models.ForeignKey(Product)
    qty = models.IntegerField()

我想通过获取所有相关的 ItemParts 并将它们的 qty 乘以它们的相关项目的 in_stock 来判断每个 Variety 中有多少被制成了项目。

我已经走到这一步了:

Variety.objects.all().prefetch_related('itempart_set').values('name').annotate(
    Sum(F("itempart_set__qty") * F("itempart_set__item_set__in_stock")
)

这行得通吗?它是对乘积求和,还是简单地相乘?

您不能对 prefetch_related 查询的模型进行数学计算,因为 prefetch_related 与原始查询分开访问数据库。您的查询集可能被评估为两个数据库查询,并且在这种情况下数据库级别的数学是不可能的。

现在,我并不是说上面的查询不起作用(Django 发挥了它的魔力,毕竟我们不知道您使用的是哪个版本),但我是说 prefetch_related 不会提高计算性能。

如果上述方法不起作用,我会尝试使用 Django 1.11 中引入的子查询来实现。