Получите в том же запросе количество активных и неактивных пользователей в django

У меня есть две модели

class User(AbstractUser):
    ...

class Agent(models.Model):
    ...
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="agent")

Я хочу иметь количество активных и неактивных пользователей в одном запросе.
Мой запрос:

Agent.objects.annotate(
        actifs=Count(User.objects.values("id").filter("is_active")),
        inactifs=Count(User.objects.values("id").filter("is_active=False")),
    )

Не работает. Как я могу это сделать?

Вы можете работать с .aggregate(…) [Django-doc], где мы используем [Count(…) выражение [Django-doc]] с filter=… параметром [Django-doc]:

from django.db.models import Count, Q

Agent.objects.aggregate(
    actifs=Count('user', filter=Q(user__is_active=True)),
    inactifs=Count('user', filter=Q(user__is_active=False))
)

Это вернет словарь с двумя записями: actifs и inactifs, например:

{ 'actifs': 25, 'inactifs': 14 }
Вернуться на верх