如何在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
相关产品推荐
相关产品推荐

