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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:45:01