首页 > 解决方案 > Django 如何过滤模型实例以及每个实例的相关对象。嵌套过滤?

问题描述

我有三个模型,流派、电影和评论。每个流派可以有多部电影,每部电影可以有多个评论。我一直在尝试过滤 Genre 实例的相关对象,以便查询集仅包含活动电影,并且每个活动电影仅包含活动评论。

模型.py

class Genre(models.Model):
    name = models.CharField(max_length=160)


class Movie(models.Model):
    genre = models.ForeignKey(Genre, null=True, on_delete=models.CASCADE, related_name='movies')
    title = models.CharField(max_length=160)
    active = models.BooleanField(default=True)


class Review(models.Model):
    movie = models.ForeignKey(Movie, null=True, on_delete=models.CASCADE, related_name='reviews')
    author = models.CharField(max_length=150)
    active = models.BooleanField(default=True)

如何从仅包含活动电影和评论的流派实例中获取查询集?感谢您的时间!

编辑: 我的目标是使用这个查询集来检索每个活动电影,然后对于每个活动电影,检索每个活动评论。因此,我正在寻找一种提供查询集的解决方案,该查询集可以很容易地按照活动电影的顺序进行迭代,然后是活动评论。

标签: pythondjango

解决方案


您可以.filter(…)[Django-doc]使用:

Review.objects.filter(active=True, movie__active=True, movie__genre=genre1)

可以使用双下划线 ( __) 来“透视”关系。

如果您想检索Movies 并且只检索活动评论,我们可以使用一个Prefetch对象:

from django.db.models import Prefetch

Movie.objects.filter(active=True, genre=genre1).prefetch_related(
    Prefetch(
        'reviews',
        queryset=Review.objects.filter(active=True),
        to_attr='active_reviews'
    )
)

Movie来自这个查询集的s 将有一个属性.active_reviews,它只包含活跃的评论。


推荐阅读