Django:通过查询计算列值的总和
我有一个模型:
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