Django使用aggregate聚合时如何获取QuerySet而非字典结果
实现方法
Django ORM的aggregate()方法设计为直接返回全表聚合计算后的字典结果,不会生成QuerySet实例。如果需要获取携带聚合结果的QuerySet,使用annotate()方法替代即可,针对全局统计场景,可通过固定值分组实现全表范围聚合,不会拆分多余分组,代码如下:
from django.db.models import Sum, Count, Value invoices_queryset = Invoice.objects.annotate( group_flag=Value(1) ).values('group_flag').annotate( total_amount=Sum('order__order_items__amount'), number_of_invoices=Count('pk', distinct=True) )
使用说明
- 该QuerySet执行后仅包含1条数据,携带的
total_amount、number_of_invoices字段值和你之前用aggregate()得到的结果完全一致 - 完整保留QuerySet特性,支持后续链式调用
filter()、切片、排序等所有QuerySet内置方法,不会像aggregate()一样直接触发SQL求值返回固定字典 - 需要获取具体统计字典时,直接取第一个元素即可:
stats = invoices_queryset[0]
内容的提问来源于stack exchange,提问作者I'mSRJ
相关产品推荐
相关产品推荐

