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))
)