从两个不同的模型在 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 中建模收藏夹的主要内容,如果未能解决你的问题,请参考以下文章

推荐收藏:Pytorch深度学习建模流程总结

推荐收藏保存和加载机器学习模型的这两个方法不错

推荐收藏保存和加载机器学习模型的这两个方法不错

书签实现逻辑django

8大模块40个思维模型,打破思维桎梏,满足你工作不同阶段场景的思维需求,赶紧收藏慢慢学

数学建模算法学习之K-means聚类算法(建议收藏)