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 中引入的子查询来实现。
我有三个模型:
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 中引入的子查询来实现。