Django Rest Framework - 如何编写多个嵌套字段序列化器(用于读取和写入)

时间:2015-05-06 00:52:02

标签: python django django-rest-framework django-serializer

我试图写一个" def create"为多个对象执行嵌套序列化的方法。

    def create(self, validated_data):
        suggested_songs_data = validated_data.pop('suggested_songs')
        suggest_song_list = list()
        for song_data in suggested_songs_data:
            song = Song.objects.create(**song_data)
            suggest_song_list.append(song)          
        message = Messages.objects.create(suggested_songs=suggest_song_list, **validated_data)
        return message

这是我的架构:

class MessagesSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.IntegerField(source='pk', read_only=True)
    suggested_songs = SongSerializer(many=True)

    class Meta:
        model = Messages
        fields = ('id','owner','url','suggested_songs',)
        #fields = ('id','url','suggested_songs',)

class SongSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Song
        fields =('id','title','artist','album','albumId','num_votes','cleared')
        read_only_fields = ('song_id')

但我收到此错误

Cannot assign "[<Song: Song object>, <Song: Song object>]":     "Messages.suggested_songs" must be a "Song" instance.

有什么建议吗?

修改

这是模型。

class Messages(models.Model):
    owner = models.OneToOneField(User, primary_key=True, related_name='user_messages', editable=False) #TODO, change owner to 'To'
    #suggested_songs = models.ForeignKey(Song, null=True, blank=True)
    suggested_songs = models.ManyToManyField(Song, related_name='suggested_songs')

1 个答案:

答案 0 :(得分:1)

如果没有已创建的对象,则无法创建manyToMany关系。您必须首先创建对象,然后建立关系。 类似的东西:

def create(self, validated_data):
    suggested_songs_data = validated_data.pop('suggested_songs')
    message = Messages.objects.create(**validated_data)
    for song_data in suggested_songs_data:
        song = Song.objects.create(**song_data)
        message.suggested_songs.add(song)
    return message