[英]Django Rest Framework Serializer popped off the validated_data after is_valid() call, causing KeyError in create
I am just following the document to test to write a nested serializer from here我只是按照文档来测试从这里编写嵌套序列化程序
http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
Below is my testing code下面是我的测试代码
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 is this 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)])]} OrderedDict([('order', 2), ('title', 'song 2'), ('duration', 11)])]}
It has a key 'tracks'它有一个关键的“轨道”
After calling is_valid(), the printed validated_data becomes调用is_valid()后,打印的validated_data变成
OrderedDict([('album_name', 'Peter ABC'), ('artist', 'Peter')])
Key 'tracks' kind of popped.关键的“曲目”突然出现。
It causes save() error它会导致 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 = validated_data.pop('tracks') will fail. track_data =validated_data.pop('tracks') 将失败。 The print(validated_data) inside create() also has 'tracks' key suddenly disappear
create() 中的 print(validated_data) 也有 'tracks' 键突然消失
{'album_name': 'Peter ABC', 'artist': 'Peter'}
May I know why?我可以知道为什么吗? My Django version 1.11.4 final and Django Rest Framework version is 3.6.3
我的 Django 版本 1.11.4 final 和 Django Rest Framework 版本是 3.6.3
tracks = TrackSerializer(many=True)
在 AlbumSerializer 中删除 read_only=True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.