Django轻松检索多对多关系模型中的项目

时间:2016-04-15 22:55:04

标签: python mysql django django-models

我与这些实体有多对多的关系:

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

class Video(models.Model):
    pass

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

这是第三种关系:

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

总结一下,我想像别名属性一样轻松访问特定播放列表的视频,有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使用直通表:

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指定一个值。