【问题标题】:Django Rest Framework Serializer popped off the validated_data after is_valid() call, causing KeyError in createDjango Rest Framework Serializer 在 is_valid() 调用后弹出了validated_data,导致创建时出现KeyError
【发布时间】:2018-02-10 02:29:54
【问题描述】:

我只是按照文档来测试从这里编写嵌套序列化程序

http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

下面是我的测试代码

    print(data_to_save)
    my_as = AlbumSerializer(data=data_to_save)
    my_as.is_valid()
    print(my_as.validated_data)
    my_as.save()

data_to_save 是这个

{'album_name': 'Peter ABC', 'artist': 'Peter', 'tracks': [OrderedDict([('order', 1), ('title', 'song 1'), ('duration', 11)]), 

OrderedDict([('order', 2), ('title', 'song 2'), ('duration', 11)])]}

它有一个关键的“轨道”

调用is_valid()后,打印出来的valid_data就变成了

OrderedDict([('album_name', 'Peter ABC'), ('artist', 'Peter')])

关键的“曲目”有点弹出。

导致 save() 错误

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

    def create(self, validated_data):
        print(validated_data)

        tracks_data = validated_data.pop('tracks')
        album = Album.objects.create(**validated_data)
        for track_data in tracks_data:
            Track.objects.create(album=album, **track_data)
        return album

tracks_data = valid_data.pop('tracks') 将失败。 create() 中的 print(validated_data) 也有 'tracks' 键突然消失

{'album_name': 'Peter ABC', 'artist': 'Peter'}

我可以知道为什么吗?我的 Django 版本 1.11.4 final 和 Django Rest Framework 版本是 3.6.3

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:
    tracks = TrackSerializer(many=True)
    

    删除 AlbumSerializer 中的 read_only=True

    【讨论】:

    • 像魅力一样工作。谢谢。
    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 2017-09-12
    • 2016-09-04
    • 2021-02-10
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多