【问题标题】:Django How to Filter Model Instances and also Related Objects for Each Instance. Nested Filtering?Django 如何过滤模型实例以及每个实例的相关对象。嵌套过滤?
【发布时间】:2021-07-11 18:34:07
【问题描述】:

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

models.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)

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

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    Review.objects.filter(<b>active=True, movie__active=True, movie__genre=genre1</b>)

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

    如果您想检索 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'
        )
    )

    来自该查询集的Movies 将具有一个属性.active_reviews,其中仅包含有效评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2016-05-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2019-09-13
      相关资源
      最近更新 更多