Django中如何单条查询同时获取活跃与非活跃用户数量
错误原因
你编写的代码不符合Django ORM的语法规范,主要问题有两个:
- annotate 不支持嵌套独立的QuerySet查询(
User.objects...这类写法无法被ORM解析为合法的聚合表达式) - 你需要统计的是Agent关联的User字段的状态计数,无需单独发起User表查询,可直接基于关联字段做条件聚合。
实现方案
写法1:兼容所有Django版本的Case When条件聚合
首先导入依赖的ORM工具类:
from django.db.models import Count, Case, When, IntegerField
使用aggregate直接返回全局统计结果(单次数据库查询):
statics = Agent.objects.aggregate( actifs=Count( Case( When(user__is_active=True, then=1), output_field=IntegerField() ) ), inactifs=Count( Case( When(user__is_active=False, then=1), output_field=IntegerField() ) ) )
最终你可以通过statics['actifs']获取活跃用户总数,statics['inactifs']获取非活跃用户总数。
写法2:Django 3.2+ 简洁写法
如果你使用的Django版本 >= 3.2,可以使用Count的filter参数简化代码:
from django.db.models import Count, Q statics = Agent.objects.aggregate( actifs=Count('id', filter=Q(user__is_active=True)), inactifs=Count('id', filter=Q(user__is_active=False)) )
两种写法的查询效率一致,均只会发起单次数据库请求。
内容的提问来源于stack exchange,提问作者leauradmin
相关产品推荐
相关产品推荐

