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

时间:2011-12-23 12:55:22

标签: python django

我有一个模特

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

我试过这个来计算此查询集中price的总和:

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

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

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

谢谢!

5 个答案:

答案 0 :(得分:141)

您可能正在寻找aggregate

from django.db.models import Sum

ItemPrice.objects.aggregate(Sum('price'))

答案 1 :(得分:21)

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')}

答案 2 :(得分:16)

使用汇总(总和(&#39;列&#39;))[&#39; column__sum&#39;]

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

答案 3 :(得分:2)

使用 cProfile Profiler ,我发现在开发环境中,对列表的值求和比使用@Service @Configurable public class ClusterService { @Autowired public RecipeDtoRepository recipeDtoRepository; private String getRecipes() { List<RecipeDto> recipe_list = new ArrayList<>(); recipeDtoRepository.findAll().forEach(recipe_list::add); return recipe_list.toString(); } public static void main(String[] a) { ClusterService clusterService = new ClusterService(); clusterService.getRecipes(); }} 进行聚合更有效(更快)。 例如:

Sum()

我在不同的上下文中对此进行了测试,似乎使用sum_a = sum([item.column for item in queryset]) # Definitely takes more memory. sum_b = queryset.aggregate(Sum('column')).get('column__sum') # Takes about 20% more time. 总是需要更长的时间才能产生相同的结果。尽管我怀疑使用内存而不是对列表求和可能在内存方面有优势。

答案 4 :(得分:2)

以前的答案非常好,而且,您可以通过一行普通代码获得总数...

items = ItemPrice.objects.all()
total_price = sum(items.values_list('price', flat=True))