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

Django ORM如何在单条查询中同时实现Count与Sum聚合统计

Django 单Queryset合并发票统计查询实现

直接在aggregate()方法内同时传入两个聚合参数即可单次查询完成两个指标的统计,无需拆分两次数据库请求,注意跨表关联场景下计数要加去重逻辑避免结果偏差。

实现代码

首先引入需要的聚合类,编写单条聚合查询:

from django.db.models import Sum, Count

invoice_stats = Invoice.objects.aggregate(
    # 统计发票关联订单项的总金额,和原有逻辑一致
    total_amount=Sum('order__order_items__amount'),
    # 统计发票总数量,加distinct避免跨表连查导致的重复计数
    total_invoice_count=Count('pk', distinct=True)
)

结果取值

查询返回的invoice_stats是标准字典类型,直接按键取值即可:

  • 发票总金额:invoice_stats['total_amount']
  • 发票总数量:invoice_stats['total_invoice_count']

注意事项

因为统计总金额时做了跨表关联(发票表→订单表→订单项表),一对多的关联关系会导致单张发票对应多条连表结果行,如果直接使用Count('*')或者不加distinct=True,会把重复的发票行重复计数,得到的发票数量会比实际值偏大。加上Count('pk', distinct=True)后会按发票主键去重计数,结果和单独调用Invoice.objects.count()完全一致。

这种写法只会向数据库发送一条聚合SQL,相比原来两次独立查询减少了一次数据库交互开销,统计结果一致性也更好。


内容的提问来源于stack exchange,提问作者I'mSRJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:54:22