【问题标题】:Django Queryset - How do I do math on related models with prefetch_related?Django Queryset - 如何使用 prefetch_related 对相关模型进行数学运算?
【发布时间】:2018-01-15 06:20:18
【问题描述】:

我有三个模型:

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 乘以它们的相关 Item 的 in_stock 来知道每种 Variety 有多少被制成了 Item。

我已经走到这一步了:

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

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

【问题讨论】:

  • “这行得通吗?”你有没有尝试过?这肯定比在 Stack Overflow 上提问更容易……
  • 好吧,我正在尝试正确设计我的模型。所以我必须建立它们,放入一堆假数据并尝试一下。我希望有人能在我把它们弄错之前确认一下。

标签: django django-queryset django-aggregation


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!这是我想知道的。
  • @AdamStarrh 如果这是您想知道的,那么也许也将其标记为正确答案?
  • 以为我点击了那个。谢谢你的收获
猜你喜欢
  • 1970-01-01
  • 2011-09-11
  • 2018-08-06
  • 2021-11-01
  • 2020-08-27
  • 2021-10-28
  • 2019-07-16
  • 2015-10-26
  • 1970-01-01
相关资源
最近更新 更多