使用 prefetch_related 过滤没有子对象的父对象

时间:2021-07-12 06:06:40

标签: django

我有以下三个模型,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 对象及其 GenreBook,如下所示:

sellers = Seller.objects.prefetch_related('genre__book').filter()

但是,我想过滤掉与 Seller 对象无关的 Book 对象。在这种情况下,filter() 的语法是什么?

1 个答案:

答案 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()])
    )