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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:56:07