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')))