0

我再次坚持使用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。

回答

0

终于明白了这一点。我的SubThingSerializer上的read_only_fields阻止数据通过验证,导致创建空的字典。我使用read_only_fiels来防止不存在的sub_thing数据被传递给我的代码,但我想我需要找到另一种方式。

相关问题