Django annotate count of subquery items - ValueError: Этот кверисет содержит ссылку на внешний запрос и может быть использован только в подзапросе

У меня есть модели агента, клиента и автомобиля.

В модели клиента: agent = ForeignKey('Agent'...)

Модель автомобиля: client = ForeignKey('Client'...)

Я хочу аннотировать (на Agent QuerySet) общее количество активных автомобилей всех клиентов агента.

Так, если у агента Боба есть клиенты Алиса и Питер, у Алисы 3 активных автомобиля, а у Питера 2 активных автомобиля, то переменная active_cars будет равна 5.

Я пытался:

Agent.objects.annotate(
    active_cars=Subquery(
        Car.objects.all().active().filter(
            client__agent=OuterRef('pk')
        ).count()
    )
)

что повышает:

ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.

Вы знаете, как это сделать?

.count() не возвращает кверисет: он выполняет кверисет. Вот почему Django жалуется.

Я понятия не имею, что делает .active(), но если просто игнорировать это, то можно получить

Agent.objects.annotate(
    active_cars=Count('client__car__id')
)

Нет необходимости в подзапросе.

Предполагая, что ваша модель Car имеет булево поле с именем "active", и именно по нему вы хотите отфильтровать подсчет, вы можете передать аргумент filter в Count для фильтрации подсчитанных строк

from django.db.models import Count, Q

Agent.objects.annotate(
    active_cars=Count('client__car', filter=Q(client__car__active=True))
)
Вернуться на верх