Django: получить все объекты с определенным набором связанных объектов

Допустим, у нас есть отношения типа "многие2многие" следующим образом:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author, related_name="books")

и теперь у меня есть известный набор Авторов:

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

Как я могу получить все книги, авторами которых является именно этот набор авторов?

books = Book.objects.filter(X)

Что такое X? Такой, что у меня есть все книги, написанные именно этим набором авторов?

Я пытался, просто потому что:

books = Book.objects.filter(authors__in=authors)

Но нет, это возвращает книги, в которые внесли вклад любые из этих авторов, похоже. Мне нужны книги, в создании которых участвовали все эти авторы и только эти авторы.

Пока что это ставит меня в тупик.

Вы можете проверить, является ли количество совпадающих авторов количеством авторов, так:

from django.db.models import Count, Q

nauthors = authors.count()

Book.objects.alias(
    nauthors=Count('authors'),
    nmatch_authors=Count('authors', filter=Q(authors__in=authors)),
).filter(
    nauthors=nauthors,
    nmatched_authors=nauthors
)

Важно, чтобы authors не не содержал дубликатов.

Вернуться на верх