Django:通过查询计算列值的总和

148 投票
7 回答
164886 浏览
提问于 2025-04-17 08:54

我有一个模型:

class ItemPrice(models.Model):
     price = models.DecimalField(max_digits=8, decimal_places=2)
     # ...

我尝试用这个方法来计算这个查询集中price的总和:

items = ItemPrice.objects.all().annotate(Sum('price'))

这个查询有什么问题吗?或者有没有其他方法可以计算price这一列的总和?

我知道可以通过在查询集上使用循环来完成,但我想要一个更优雅的解决方案。

谢谢!

7 个回答

54

Annotate 是用来给结果添加一个字段的:

>> Order.objects.annotate(total_price=Sum('price'))
<QuerySet [<Order: L-555>, <Order: L-222>]>

>> orders.first().total_price
Decimal('340.00')

Aggregate 则是返回一个字典,里面包含你想要的结果:

>> Order.objects.aggregate(total_price=Sum('price'))
{'total_price': Decimal('1260.00')}
65

使用 .aggregate(Sum('column'))['column__sum'] 来参考我下面的例子

sum = Sale.objects.filter(type='Flour').aggregate(Sum('column'))['column__sum']
313

你可能是在寻找 aggregate 这个功能。

from django.db.models import Sum

ItemPrice.objects.aggregate(Sum('price'))
# returns {'price__sum': 1000} for example

撰写回答