Django Query基于子表字段查询父表值并去重统计关联机构数量
问题解答
你需要在聚合时对关联的BankingDetail主键去重统计即可,无需遍历处理数据集,Django ORM原生支持该能力:
首先导入聚合函数:
from django.db.models import Count
然后编写查询语句:
institution_count = TransactionBankDetail.objects.filter( institution__isnull=False ).values("institution").annotate( # 对关联的BankingDetail去重计数,同一机构下相同BankingDetail仅算1次 total=Count("bankingDetail", distinct=True) ).order_by("-total")
运行后输出结果格式为:
<QuerySet [ {'institution': 'South Pacific', 'total': 2}, {'institution': 'Atlantic', 'total': 2}, {'institution': 'Africa', 'total': 1} ]>
完全符合预期统计结果。
原代码问题说明
你之前的写法没有做去重处理,values('bankingDetail__sfAttachmentID', 'institution')会返回所有符合条件的TransactionBankDetail条目,同一sfAttachmentID+institution组合会因为关联多条交易记录重复出现,直接统计得到的是交易条目数而非去重后的机构关联附件数。
可选备用方案
如果你需要先拿到去重后的sfAttachmentID+institution组合再做其他处理,可以先调用distinct()去重:
# 先得到去重的组合列表 distinct_pairs = TransactionBankDetail.objects.filter( institution__isnull=False ).values("bankingDetail__sfAttachmentID", "institution").distinct()
再对该结果按institution分组统计即可,两种方案结果一致,前者性能更优。
内容的提问来源于stack exchange,提问作者Manza
相关产品推荐
相关产品推荐

