Подсчитайте количество с агрегацией Django через несколько полей «многие ко многим»

Дана модель 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)
...

person 43Tesseracts    schedule 18.12.2018    source источник


Ответы (1)


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

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

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

<Queryser [{'id': 1, 'num_publishers': 10}, {'id': 2, 'num_publishers': 2}, ... ]>
person Sergey Pugach    schedule 18.12.2018