Подсчитать количество с помощью Django Aggregation через несколько полей «многие ко многим» - PullRequest
0 голосов
/ 18 декабря 2018

Учитывая модель Django с двумя полями M2M:

class Book(models.Model):
    name = models.CharField(max_length=300)
    authors = models.ManyToManyField(Author)
    publishers = models.ManyToManyField(Publisher)

И начиная с набора запросов авторов:

authors = Author.objects.filter(...)

Как я могу аннотировать счет от числа издателей (неисключительных), с которыми автор .... взаимодействовал?

Я могу получить количество книг, которые есть у автора:

authors.objects.annotate(num_books=Count('book'))

Но что я хочуявляется подсчетом числа издателей для всех книг.

Например, если данные были такими:

Book | Authors | Publishers
B1     A1        P1, P2
B2     A2, A1    P1
B2     A2        P1, P2, P3
...

Полученные аннотированные подсчеты будут:

Author |  Publishers
A1        3 (B1-P1, B1-P2, B2-P1)
A2        4 (B2-P1, B3-P1, B3-P2, B3-P3)
...

1 Ответ

0 голосов
/ 18 декабря 2018

Пожалуйста, попробуйте:

authors.annotate(num_publishers=Count('book__publishers')).values('id', 'num_publishers')

Результат будет:

<Queryser [{'id': 1, 'num_publishers': 10}, {'id': 2, 'num_publishers': 2}, ... ]>
...