从两个不同的模型在 Django 中建模收藏夹
Posted
技术标签:
【中文标题】从两个不同的模型在 Django 中建模收藏夹【英文标题】:Modeling favorites in Django from two different models 【发布时间】:2021-02-19 13:30:16 【问题描述】:我正在创建一个 Netflix 克隆应用程序,但我在使用模型时遇到了困难。 我有一个 Movie 模型,其中包含电影的字段,例如标题、持续时间、评级等。 我不确定我应该如何为我的数据库建模,但我认为我应该做的是多对多关系,例如,一个用户可以收藏很多电影,而一部电影可以被很多用户收藏。
但是,如果我这样做,我觉得我最终会得到一个包含许多用户和电影的收藏夹表,并且可能将此视为一个问题,必须遍历每一行才能找到当前用户,而不是这样做可能是 OneToMany 关系,例如,一个用户可以收藏很多电影,而一个电影可以被用户收藏。
首先,我不确定建模的正确方法是什么。
我也不知道如何将这种关系添加到我的用户模型中,因为我使用的是从django.contrib.auth.models
引入的用户模型
我在想办法解决这个问题时遇到了很多麻烦,我不想只是为用户添加一个多对多字段到我拥有的电影表中,而不了解它是否以及为什么它是一个好的/不好的方法。
【问题讨论】:
您可以使用GenericForeignKey
:docs.djangoproject.com/en/3.0/ref/contrib/contenttypes/…
不确定我是否理解正确,但这是否意味着我想要一个 GenericRelation。根据文档,我似乎无法使用 GenericForeignKey 过滤所有用户喜爱的内容,但使用 GenericRelation 我可以通过 .all()
获取所有喜爱的电影?
【参考方案1】:
怎么样:
class User(...):
first_name = models.CharField(...)
....
class Movie(models.Model):
title = models.CharField(...)
...
class Favorite(models.Model):
user = models.ForeignKey('User', related_name='favorites', ...)
movie = models.ForeignKey('Movie', related_name='favorites', ...)
那么我们可以这样做:
# a particular user's favorite movies:
user = User.objects.get(id='the_user_id')
user.favorites.values('movie')
# number of users who have favorited a particular movie:
movie = Movie.objects.get(id='the_movie_id')
movie.favorites.count()
【讨论】:
谢谢,我会在接受之前尝试一下,但这看起来确实是我想要的。您知道仅向电影模型本身添加多对多用户字段之间是否有区别? 如果您在用户模型(或电影模型)上设置了 ManyToMany 字段,Django 将自动创建“Favorites”表,因此您的 db 架构基本上是相同的。实际上有很多方法可以完成您正在尝试做的事情。最好的办法是尝试一些简单的东西并随着需求的增长扩展您的代码。以上是关于从两个不同的模型在 Django 中建模收藏夹的主要内容,如果未能解决你的问题,请参考以下文章