我有一个模型:
class ItemPrice(models.Model):
price = models.DecimalField(max_digits=8, decimal_places=2)
# ...
我试着计算这个查询集中price
的总和:
items = ItemPrice.objects.all().annotate(Sum('price'))
这个查询有什么问题?或者有没有其他方法来计算Sum of price
列?
我知道这可以通过在queryset上使用for循环来实现,但我需要一个优雅的解决方案。
谢谢!
7条答案
按热度按时间xqk2d5yq1#
您可能正在查找
aggregate
0yg35tkg2#
使用
.aggregate(Sum('column'))['column__sum']
reefer我的例子如下bvjveswy3#
“注解”将字段添加到结果:
聚合返回一个带有请求结果的dict:
fwzugrvs4#
使用 cProfile profiler,我发现在我的开发环境中,对列表值求和比使用
Sum()
聚合更有效(更快)。例如:我在不同的上下文中测试了这个,似乎使用
aggregate
总是需要更长的时间来产生相同的结果,尽管我怀疑使用它而不是对列表求和可能会有内存方面的优势。93ze6v8z5#
前面的答案都很好,而且,你可以用一行香草代码得到那个总数...
tzxcd3kk6#
您也可以通过以下方式获得总和:
将“金额”替换为您要计算总和的型号中的列名称,并将“销售额”替换为您的型号名称。
5w9g7ksd7#
您需要使用aggregate()和Sum()来计算
price
列的和,如下所示。* 使用all()的查询等同于不使用all()的查询,如下所示:然后,在控制台上输出以下字典:
并且,您可以将price列的默认键
price__sum
更改为priceSum
,如下所示:然后,默认密钥更改如下: