Python Django:按agent__id和account去重后统计agent__id次数问题
修正Django ORM去重后统计逻辑的方案
你遇到的问题核心是统计对象错误:原来的Count(F('agent'))是在统计每个agent__id关联的Agent模型实例数量(每个agent__id对应唯一的Agent,你的原始输出异常大概率是Django ORM对关联字段计数的特殊逻辑导致的),而你真正需要的是统计去重后的(agent__id, account)组合中,每个agent__id出现的次数。
修正后的代码
from django.db.models import Count # 链式调用实现去重+分组统计 result = AgentPayLog.objects.values('agent__id', 'account').distinct()\ .values('agent__id')\ .annotate(agent_count=Count('*'))\ .values('agent__id', 'agent_count') # 转换为列表查看结果 print(list(result))
代码逐段解释
values('agent__id', 'account').distinct():先筛选出所有唯一的(agent__id, account)组合,这一步会把你原始数据中重复的(2, 30001)条目合并成一条,得到去重后的数据集。values('agent__id'):指定后续分组统计的依据是agent__id字段。annotate(agent_count=Count('*')):用Count('*')直接统计每个agent__id在去重后数据集中的出现次数(也就是分组后的行数),这正是你需要的统计逻辑。values('agent__id', 'agent_count'):最终只保留我们关心的两个字段,避免冗余数据。
运行后得到的结果完全符合你的期望:
[{'agent__id': 1, 'agent_count': 1}, {'agent__id': 2, 'agent_count': 1}]
可选的子查询写法(逻辑更清晰)
如果你觉得链式调用不够直观,也可以用子查询的方式拆分逻辑,效果完全一致:
from django.db.models import Count # 先定义去重的子查询 unique_agent_account_pairs = AgentPayLog.objects.values('agent__id', 'account').distinct() # 基于去重后的结果分组统计 result = unique_agent_account_pairs.values('agent__id')\ .annotate(agent_count=Count('*'))\ .values('agent__id', 'agent_count')
内容的提问来源于stack exchange,提问作者mango
相关产品推荐
相关产品推荐

