Django подсчитывает все уникальные точности поля многие-ко-многим

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

class Book:
    author = models.ManyToManyField()

class Author:
    ...

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

example

КнигаА: АвторА, АвторВ
КнигаВ: АвторВ, АвторС

У других D, E, F нет книги

поэтому результатом должен быть набор запросов Автор АВС.

Большинство существующих ответов - это просто подсчет авторов каждой книги. Спасибо

Вы можете попробовать следующее:

Books.objects.values_list('Author').distinct.()

Вы можете аннотировать набор запросов параметром Count, чтобы получить количество книг автора, а затем отфильтровать набор запросов по аннотированному значению:

from django.db.models import Count

queryset = Author.objects.annotate(books_count=Count("book_set")).filter(
    books_count__gt=0
)

Приведенный выше подход отлично подходит, если вы со временем захотите изменить требуемое books_count. Если вы уверены, что всегда будете проверять только наличие книг у пользователя, вы также можете использовать book_set__isnull:

queryset = Author.objects.filter(book_set__isnull=False)

@yyyyyyyan ответ совершенно правильный. Вы также можете использовать Exists подзапрос для того, чтобы сделать то же самое и даже больше, если вам нужно больше фильтрации

Author.objects.filter(Exists(Book.object.filter(author=OuterRef('pk')))
Вернуться на верх