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

如何在Django中用annotate高效统计关联模型的去重用户数?

Django Annotate统计关联模型中content非空的唯一用户数优化方案

直接通过annotate结合Count的去重参数与过滤条件,就能实现单查询统计,无需额外子查询:

from django.db.models import Count, Q

# 查询指定pk的A实例及对应统计值
a_obj = A.objects.annotate(
    unique_valid_users=Count(
        'b__user',
        distinct=True,
        filter=Q(b__content__isnull=False)
    )
).get(pk=1)

print(a_obj.unique_valid_users)  # 输出2

# 批量查询所有A实例的统计结果
a_queryset = A.objects.annotate(
    unique_valid_users=Count(
        'b__user',
        distinct=True,
        filter=Q(b__content__isnull=False)
    )
)

代码说明

  • Count('b__user', distinct=True):对关联B表中的user字段去重计数,避免同一用户多条有效记录重复统计
  • filter=Q(b__content__isnull=False):仅筛选content不为空的B表记录,排除无效数据
  • 该方案会生成单条SQL内联查询,避免了子查询带来的额外数据库请求,性能更优

针对你提供的测试数据,A的pk=1对应的有效B记录为row1、row2,对应唯一用户2、3,统计结果为2,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:56:03