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
не не содержал дубликатов.