Аннотировать количество связанных отфильтрованных объектов

#django #django-queryset #django-database #django-aggregation #django-annotate

#django #django-набор запросов #django-база данных #django-агрегация #django-аннотировать

Вопрос:

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

 class Shop(..):
    category = ForeignKey...

class Product(..):
    shop = ForeignKey...
    category = ForeignKey...
    is_active = BooleanField...

class Category(..):
    name = ...
  

Мне нужно аннотировать количество активных продуктов для каждой категории.

В основном это:

 for cat in Category.objects.all():
    count = Product.objects.filter(shop__category=cat)
  

Я пытался:

 Category.objects.annotate(product_count=Count('shop__products'),filter=Q(shop__products__is_active=True))

django.core.exceptions.FieldError: Related Field got invalid lookup: is_active
  

Это вызывает ошибку. Вы знаете, как это аннотировать?

Комментарии:

1. Какая ошибка у вас есть?

2. @ArakkalAbu django.core.exceptions. Ошибка поля: в соответствующем поле получен неверный поиск: is_active

3. Кстати, из вашего сообщения неясно, как связаны Shop и Product . ИМХО, лучше добавить «соответствующую точную спецификацию модели» в вопросы, чтобы у вас была высокая вероятность получения точных ответов.

Ответ №1:

filter должно быть аргументом Count объекта:

 Category.objects.annotate(product_count=Count('shop__products', filter=Q(shop__products__is_active=True)))