【问题标题】:Django: Calculate the Sum of the column values through queryDjango:通过查询计算列值的总和
【发布时间】:2012-01-26 19:55:57
【问题描述】:

我有模特

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

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

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

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

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

谢谢!

【问题讨论】:

标签: python django


【解决方案1】:

您可能正在寻找aggregate

from django.db.models import Sum

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

【讨论】:

  • 我怎样才能得到 price=5000 的总数?
  • 记住返回字典不是浮点数/整数,例如{'price__sum':1000} 。可以使用yourdict['price__sum'] 获取浮点数/整数
【解决方案2】:

使用.aggregate(Sum('column'))['column__sum']冷藏我下面的例子

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

【讨论】:

  • 我收到一个错误:'decimal.Decimal' 对象不可迭代
【解决方案3】:

Annotate 在结果中添加一个字段:

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

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

聚合返回一个带有询问结果的字典:

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

【讨论】:

  • 感谢您展示如何指定 key 以将总和 value 存储到。
【解决方案4】:

使用 cProfile 分析器,我发现在我的开发环境中,对列表的值求和比使用 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.

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

【讨论】:

  • 或者,使用生成器表达式而不是列表:sum_a = sum(item.column for item in queryset)。唯一的区别是删除了[]s。这节省了在sum() 迭代之前计算整个列表的内存空间。
  • 出现错误:'decimal.Decimal' 对象不可迭代
【解决方案5】:

以前的答案很好,而且,你可以用一行香草代码得到这个总数......

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

【讨论】:

    【解决方案6】:

    您也可以通过这种方式获得总和:

    def total_sale(self):
        total = Sale.objects.aggregate(TOTAL = Sum('amount'))['TOTAL']
        return total
    

    将“金额”替换为您想要计算总和的型号中的列名称,并用您的型号名称替换销售额。

    【讨论】:

    • 请不要忘记导入 Sum: from django.db.models import Sum
    猜你喜欢
    • 2022-01-04
    • 2020-12-25
    • 2021-01-02
    • 2021-12-20
    • 1970-01-01
    • 2013-06-11
    • 2017-01-19
    • 2020-05-02
    • 2019-03-26
    相关资源
    最近更新 更多