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
相关产品推荐
相关产品推荐

