假设我们有如下的许多关系:
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
不包含重复项。