在 django orm 中对多个注释求和

Posted

技术标签:

【中文标题】在 django orm 中对多个注释求和【英文标题】:Sum multiple annotates in django orm 【发布时间】:2021-11-03 06:05:41 【问题描述】:

这是我的模型:

class Product:
  name = models.CharField(max_length=80)
  price = models.FloatField()
  category = models.CharField(max_length=40)
class ProductInventory:
  inventory = models.IntegerField()
  product = models.OneToOneField(Product, on_delete=models.RESTRICT)

这是我想要实现的原始 sql,但我如何在 django ORM 中编写它?

SELECT product.category, SUM(price) * SUM(product_inventory.inventory) 
FROM product LEFT JOIN product_inventory 
ON product.id=product_inventory.product_id group by product.category;

谢谢。

【问题讨论】:

【参考方案1】:

您可以尝试在注释中使用 Sum 并创建一个名称为 sum_product 的虚拟字段,并将其传递给这样的值。希望这对你有用。

from django.db.models import Sum

Product.objects.annotate(sum_product=Sum('price') * Sum('productinventory__inventory')).values('category', 'sum_product')

【讨论】:

以上是关于在 django orm 中对多个注释求和的主要内容,如果未能解决你的问题,请参考以下文章

如何使用注释在 Django ORM 中创建通知日期字段

复杂的 Django ORM 注释和聚合

prefetch_related 上的 Django ORM 注释

通过 Django ORM 重命名嵌套注释字段

Django ORM 使用过滤器进行注释

Django ORM:如何根据注释 timedelta 结果进行过滤