You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:11:30