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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:36:01