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

Django中基于两步关联使用annotate统计数据的实现疑问

嘿,我来帮你搞定这个Django的统计问题!要实现每个Category下contact_result=3的Player数量统计,你可以用annotate结合Count的过滤参数来完成,具体写法如下:

完整实现代码
from django.db.models import Count, Q
from .models import Category

# 给每个Category添加统计字段,记录符合条件的Player数量
categories_with_stats = Category.objects.annotate(
    contact_3_player_count=Count(
        'player',
        filter=Q(player__playercontact__contact_result=3),
        distinct=True
    )
)

# 可以这样遍历查看结果
for cat in categories_with_stats:
    print(f"分类{cat.id}中,contact_result=3的Player有{cat.contact_3_player_count}个")

关键细节解释

  • 跨表过滤条件:用双下划线__跨表关联,player__playercontact__contact_result=3表示只统计那些关联了contact_result=3的PlayerContact的Player。
  • distinct=True的必要性:如果某个Player有多个contact_result=3的PlayerContact记录,不加这个参数会重复统计同一个Player。加上它能保证每个符合条件的Player只被计数一次,正好匹配你要统计“有多少个Player”的需求。
  • Count的目标字段:这里我们统计的是Player的数量,所以第一个参数填'player',而不是直接统计playercontact,这样能更精准地得到Player的数量。

内容的提问来源于stack exchange,提问作者Onilol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:26:05