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

Ahs*_*san 62 python django

我有一个模特

class ItemPrice( models.Model ):
     price = models.DecimalField ( max_digits = 8, decimal_places=2 )
     ....
Run Code Online (Sandbox Code Playgroud)

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

items = ItemPrice.objects.all().annotate(Sum('price'))
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Mat*_*ttH 160

你可能正在寻找 aggregate

from django.db.models import Sum

ItemPrice.objects.aggregate(Sum('price'))
Run Code Online (Sandbox Code Playgroud)

  • 记住返回的字典不是float / integer,例如`{'price__sum':1000}`。可以使用`yourdict ['price__sum']`获取浮点数/整数 (3认同)

Ibr*_*tov 21

Annotate为结果添加一个字段:

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

>> orders.first().total_price
Decimal('340.00')
Run Code Online (Sandbox Code Playgroud)

Aggregate返回带有询问结果的dict:

>> Order.objects.aggregate(total_price=Sum('price'))
{'total_price': Decimal('1260.00')}
Run Code Online (Sandbox Code Playgroud)


uga*_*oft 19

使用聚合(Sum('column'))['column__sum']

sum = Sale.objects.filter(type='Flour').aggregate(Sum('column'))['column__sum']
Run Code Online (Sandbox Code Playgroud)


小智 8

使用cProfile profiler,我发现在我的开发环境中,对列表的值求和比使用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.
Run Code Online (Sandbox Code Playgroud)

我在不同的上下文中对此进行了测试,似乎使用aggregate总是需要更长的时间才能产生相同的结果。尽管我怀疑使用它而不是对列表求和可能在内存方面有优势。

  • 或者,使用生成器表达式而不是列表:“sum_a = sum(item.column for item in queryset)”。唯一的区别是删除了 `[]`。这可以节省在“sum()”迭代之前计算整个列表的内存空间。 (4认同)

Jcc*_*ria 8

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

items = ItemPrice.objects.all()
total_price = sum(items.values_list('price', flat=True))
Run Code Online (Sandbox Code Playgroud)