Django REST框架:嵌套序列化器和反序列化
我再次坚持使用Django REST框架及其序列化器。Django REST框架:嵌套序列化器和反序列化
基本上,我希望能够做的就是下面的输入数据粘成一个serializers.Serializer实例:
data = {
"thing_id": 715,
"sub_things": [
{
"id": 1,
"name": "bob"
},
{
"id": 2,
"name": "mike"
}
]
}
sub_things的处理由serializers.ModelSerializer称为SubThingSerializer。这是它的样子。事情的
class SubThingSerializer(serializers.ModelSerializer):
class Meta:
model = SubThing
fields = ('id', 'name')
read_only_fields = ('id', 'name')
序列化由ThingSerializer,我已经对现在如下处理处理:
class ThingSerializer(serializers.Serializer):
thing_id = serializers.IntegerField()
sub_things= SubThingSerializer(many=True)
现在,当我做
serializer = ThingSerializer(data=data)
我得到空OrderedDicts像:
{'sub_things': [OrderedDict(), OrderedDict()], 'thing_id': 715}
I猜测ThingSerializer不需要存储到数据库中是明智的,但它确实使用了数据库中的sub_things。这些也不会写入数据库。这只是为了跟踪事物包含哪些子事物,在浏览器客户端和Python对象之间来回传递这些数据以进行一些计算。也可以将它存储在会话中。
编辑1:
最有可能有一些我需要添加到我的ThingSerializer的创建方法。所以,我想最终的问题是:什么是将sub_thing数据传递给SubThingSerializers的正确语法?
编辑2:
我挖了一点。似乎由于某种原因,空的OrderedDicts会通过validated_data传递给ThingSerializer.create()。序列化器使用serializer.is_valid()验证是否正常。我可以从initial_data访问必要的数据,但这看起来不太稳固。
编辑3:
还与serializers.ListField(),用于围绕sub_things测试。仍然在create方法内的validated_data中看到空的OrderedDicts。
终于明白了这一点。我的SubThingSerializer上的read_only_fields阻止数据通过验证,导致创建空的字典。我使用read_only_fiels来防止不存在的sub_thing数据被传递给我的代码,但我想我需要找到另一种方式。