如何使用through创建与ManyToMany创建的关系?

时间:2017-01-11 06:03:08

标签: python django django-rest-framework

我的模特有:

class Playlist(models.Model):
    key = models.CharField(max_length=255, blank=True, unique=True)
    user = models.ForeignKey(User)
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField(auto_now_add=True)
    videos = models.ManyToManyField(Video, through='PlaylistVideo')

class PlaylistVideo(models.Model):
    playlist = models.ForeignKey(Playlist)
    video =    models.ForeignKey(Video)
    position = models.IntegerField()

class Video(models.Model):
    title = models.CharField(max_length=255,blank=True)
    description = models.TextField(blank=True)
    thumb =  models.URLField(blank=True)
    duration = models.IntegerField(default=0)

我想为播放列表和API编写POST(创建)。不确定如何处理视频字段。

  1. 如何为视频字段发送值?
  2. Django 1.8和django-rest-framework

    由于

1 个答案:

答案 0 :(得分:0)

来自DRF documentation

  

默认情况下,以指定的直通模型为目标的ManyToManyField的关系字段设置为只读。

因此,在创建Video时,您肯定无法创建Playlist个实例。

现在,考虑到您已经拥有Video个对象,并且想要创建一个包含其中一些视频的Playlist,有两种方法可以解决这个问题。

  1. 您在创建Playlist的同时创建m2m关系:

    class PlaylistSerializer(ModelSerializer):
    
        videos = PrimaryKeyRelatedField(many=True)
    
        class Meta:
            model = Playlist
    
  2. 您只在Playlist上创建POST,没有任何视频,然后您创建另一个端点(例如playlist/<playlist_id>/videos/),您可以在其中添加/删除所需的视频。
  3. 两者都有利有弊,但我的意见是你应该先设计API,然后考虑如何继续编辑Playlist

    您是逐个添加视频吗?你批量添加它们吗? 你如何删除视频?这可以批量完成吗?

    一旦你对这些问题得到正确答案,实施应该相当简单。

    祝你好运!