0

我有三个模型:

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()

qty我想通过获取所有相关的 ItemParts 并将它们乘以它们的相关 Items来告诉每个 Variety 有多少被制成了in_stockItems。

我已经做到了这一点:

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

这行得通吗?它会将乘积相加,还是简单地将总和相乘?

4

1 回答 1

2

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

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

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

于 2017-09-14T06:12:36.247 回答