Django中如何将QuerySet聚合结果除以整数?
解决Django聚合结果除法计算问题
方法1:Python层面遍历处理(适合新手快速实现)
你需要遍历QuerySet中的每个字典,针对聚合后的金额字段单独做除法运算,把结果存入新的键中:
from decimal import Decimal from datetime import date from django.db.models import Sum def projection(request): divider = Decimal(date.today().strftime('%d')) # 用Decimal避免金额精度丢失 # 给聚合结果重命名为total,更直观 qs = ManagerialRevenue.objects.values('accountplan__name').annotate(total=Sum('amount')) # 遍历每个结果字典,计算日均金额 for item in qs: item['daily_amount'] = item['total'] / divider return render(request, 'app/pages/planning/projection.html', context={'qs': qs,})
模板中直接调用新生成的字段:
{% for item in qs %} {{ item.accountplan__name }} {{ item.daily_amount }} {% endfor %}
方法2:数据库层面计算(性能更优,推荐大数据量场景)
利用Django的ExpressionWrapper和F表达式,直接在数据库中完成除法运算,避免把全量数据拉到Python内存中处理:
from decimal import Decimal from datetime import date from django.db.models import Sum, F, ExpressionWrapper from django.db.models.fields import DecimalField def projection(request): divider = Decimal(date.today().strftime('%d')) qs = ManagerialRevenue.objects.values('accountplan__name').annotate( total=Sum('amount'), # 用ExpressionWrapper指定输出字段的精度配置 daily_amount=ExpressionWrapper( F('total') / divider, output_field=DecimalField(max_digits=12, decimal_places=2) ) ) return render(request, 'app/pages/planning/projection.html', context={'qs': qs,})
模板调用方式和方法1完全一致。
关键说明
- 你之前的错误是直接对QuerySet或字典对象做除法,这是不允许的,必须针对字典内的具体字段值操作。
- 金额计算务必使用
Decimal类型,避免浮点数精度丢失问题。
内容的提问来源于stack exchange,提问作者Zedh
相关产品推荐
相关产品推荐

