python - Django 在多对多关系模型中轻松检索项目

标签 python mysql django django-models

我与这些实体存在多对多关系:

class Playlist(models.Model):
    videos = models.ManyToManyField("Video")

class Video(models.Model):
    pass

我需要第三个模型来用这两个实体的外键替换 M2M 关系,而无需实际修改我们访问和查询播放列表视频的方式 PlayList().videos,这将把我们带入代码重构 hell 。

这是第三种关系:

class PlaylistVideos(models.Model):
    playlist = models.ForeignKey('PlayList') 
    video = models.ForeignKey('Video')
    new_field = models.IntegerField()
    #... other stuff

总而言之,我想要一个别名属性之类的东西,以便轻松访问特定播放列表的视频,有什么建议吗?

最佳答案

您可以使用直通表:

class Playlist(models.Model):
    videos = models.ManyToManyField("Video", through="PlaylistVideos")

这已记录在案here 。您仍然可以通过 playlist.videos 访问视频,但它会生成多个查询,因此效率会比以前低。这在How do I make Django ManyToMany 'through' queries more efficient?中进行了讨论。 。您需要确定额外的查询是否会对您的应用程序产生重大影响。正如 docs 中所讨论的,如果不使用 PlaylistVideos 模型,您将无法将新视频添加到播放列表,因为您需要为 new_field 指定一个值。

关于python - Django 在多对多关系模型中轻松检索项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658105/

相关文章:

python - 在 Pyramid 中创建动态类 View

python - 如何从 read_game 中获取棋盘的最终位置?

mysql - 将一个表的某一列中的所有值复制到另一个表的特定列

php - MySQL & 代码点火器 3 : Error too many connection

mysql - 为使用 C# 和 MySQL 开发的应用程序向客户提供软件更新的方法

python - __classcell__传播了RuntimeError : __class__ not set defining 'AbstractBaseUser' as <class 'django.contrib.auth.base_user.Abstract BaseUser' >.

python - 为什么这里会发生递归?

python - 修复 torchvision 变换的随机种子

django send_mail 具有指向 http ://dpaste. com/的不安全链接

python - Django:从*相关*模型自动保存OneToOneField?