【问题标题】:Django - get objects by related_query_nameDjango - 通过related_query_name 获取对象
【发布时间】:2021-07-21 12:52:38
【问题描述】:

我的 models.py 中有以下模型,用于在我的数据库中存储特定对象的流派信息,例如电影:

class Genre(models.Model):
    objects = RandomManager()
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    content_type = models.ForeignKey(ContentType, limit_choices_to=referential_genre_models, on_delete=models.CASCADE, verbose_name=_("Content Type"))
    object_id = models.CharField(max_length=36, verbose_name=_("Object ID"))
    content_object = GenericForeignKey('content_type', 'object_id')
    name = models.CharField(verbose_name=_("Genre"), blank=True, null=True, editable=False, max_length=50)
    date_added = models.DateTimeField(auto_now_add=True, verbose_name=_("Date Added"))

在我的电影模型类中,我有以下字段将两个模型相互连接:

genre_relation = GenericRelation(Genre, related_query_name='genre_relation')

在我的 views.py 中,我现在想查询类型为“喜剧”和“家庭”的特定电影,但我没有得到任何结果:

movie_genre_assets = Movies.objects.get_queryset().filter(Q(genre_relation__name="Comedy") | Q(genre_relation__name="Family")).order_by('release_date')

可以。帮忙?

【问题讨论】:

  • 只是为了确保 - 您确定您存储了“家庭”和“喜剧”两种类型的电影吗?你能在数据库或管理员中看到吗? (顺便说一句 - 你的问题“Comendy”中有错字 - 这可能只是在你的问题中。)
  • 什么是RandomManager - 您可以链接您使用的库或发布您自己的代码吗?
  • 查询看起来没问题。也许get_queryset() 给你的结果没有ComedyFamily

标签: python django django-queryset django-generic-relations


【解决方案1】:

您应该使用through table 而不是 GenericRelation。这是一个单独的模型,具有 Movie 和 Genre 的外键,每条记录形成一个关系。

class Movie(models.Model):
    genre = models.ManyToManyField(through="MovieGenre")
    ...

class Genre(models.Model):
    ...

class MovieGenre(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE)

然后您可以通过以下方式访问属于某个类型的电影:

movie.genre.all()

以及属于一个动作的所有流派:

genre.movie_set.all()

【讨论】:

  • 这里的好处在哪里?有没有办法使用泛型关系?
  • 老实说,在阅读您的问题之前我没有遇到过 GenericRelation,所以除了扫描文档之外,我无法告诉您它是否比我建议的解决方案更好或更差因为这似乎是您在过滤流派时遇到问题的原因。我相信我建议的方法更标准,而且我知道它有效。
  • 通用关系对类别有很大的意义。如果您不仅想对一个模型(电影)进行分类,还想对其他不相关的模型(例如书籍、游戏等)进行分类,通用关系是一个非常有效的解决方案。因此,如果您绝对不会对电影以外的任何内容进行分类,那么 M2M 只会是这里的首选解决方案。
  • 更多通过模型(例如 BookGenre、GameGrenre 等)在这种情况下也可以工作。这将是我的首选解决方案,因为它在数据库上保留了更明确的结构,而且我更熟悉它。这并不是说泛型关系不是同样有效或可能更好的解决方案。
  • 明确一点,我确实遇到了这个问题。我这里不仅有电影,还有音乐、电子书、电视节目等。基本上任何可以是基于媒体的内容,所以在这种情况下编写 ManyToManyField 似乎非常不切实际。最后,我还需要 3-5 个模型类来设置类型,真的吗?任何其他解决方案
猜你喜欢
  • 2012-06-30
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2017-06-30
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多