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

时间:2017-08-07 20:46:13

标签: django django-queryset django-aggregation

我有三种模式:

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

这会有用吗?它会对产品求和,还是简单地乘以总和?

1 个答案:

答案 0 :(得分:1)

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

现在,我并不是说上述查询不起作用(Django正在发挥作用,毕竟我们不知道你正在使用哪个版本),但我和#39;我说prefetch_related不会给你提高计算性能。

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