我有以下三个模型,Seller
作为祖父母,Genre
作为父母,Book
作为孩子:
class Seller(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class Genre(models.Model):
seller= models.ForeignKey(Seller, related_name="genre", on_delete=models.CASCADE)
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class Book(models.Model):
genre= models.ForeignKey(Genre, related_name="book", on_delete=models.CASCADE)
name = models.CharField(max_length=20)
def __str__(self):
return self.name
如果我在单个数据库查询中使用 prefetch_related()
获取 Seller
对象及其 Genre
和 Book
,如下所示:
sellers = Seller.objects.prefetch_related('genre__book').filter()
但是,我想过滤掉与 Seller
对象无关的 Book
对象。在这种情况下,filter()
的语法是什么?
答案 0 :(得分:1)
要过滤没有书籍的流派,您需要满足以下条件:
genres = Genre.objects.exclude(pk__in=[x.genre.pk for x in Book.objects.all()]
要将它与 prefetch_related
结合使用,我认为您需要将 Prefetch
对象与给定的查询集一起使用
from django.db.models import Prefetch
sellers = Seller.objects.prefetch_related(
Prefetch('genre_set',
queryset=Genre.objects.exclude(pk__in=[x.genre.pk for x in Book.objects.all()])
)