аннотировать сумму аннотированных значений в связанной модели - PullRequest
1 голос
/ 04 февраля 2020

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

class Product(..):
    category = ForeignKey('InputCategory...

class InputCategory(MPTTModel):
   route_to = ForeignKey('RoutingCategory...

class RoutingCategory(MPTTModel):
   pass

Так что InputCategory имеет много Products, а RoutingCategory имеет много InputCategory объектов.

Я могу комментировать product_count для InputCategory:

InputCategory.objects.annotate(product_count=Count('products'))

Но мне нужно аннотировать product_count на RoutingCategory.

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

Я попытался изменить Manager для InputCategory и сделать это:

RoutingCategory.objects.annotate(product_count=Sum('input_categories__product_count'))

Но там написано: FieldError: Unsupported lookup 'product_count' for AutoField or join on the field not permitted.

Очевидно, я должен переопределить связанный менеджер.

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

РЕДАКТИРОВАТЬ

@ Виллем Ван Онсем придумал ответ, который работает:

from django.db.models import Count
RoutingCategory.objects.annotate(
    product_count=Count('input_categories__products')
)

Но я также аннотировал product_cumulative_count, который считает продукты себя и всех предков InputCategory. Я хотел бы получить доступ к этой сумме этих подсчетов также из RoutingCategory.

Я не могу понять, как.

1 Ответ

1 голос
/ 04 февраля 2020

Прежде всего, проблема в том, что Django делает , а не использует менеджер .objects для доступа к связанной модели. Но даже если бы это было так, это не сработало бы (хорошо). SQL не разрешает такие многоуровневые GROUP BYs или, по крайней мере, без предварительного создания запроса и последующего использования этого результата в другом запросе.

Однако вам это все равно не нужно, вы можете просто Count сопутствующие товары здесь:

from django.db.models import <b>Count</b>

RoutingCategory.objects.annotate(
    product_count=<b>Count('input_categories__products')</b>
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...