处理嵌套序列化器哪个不是模型的一部分?

时间:2019-05-30 05:09:12

标签: django serialization django-rest-framework python-3.6 django-2.2

我想使用读/写嵌套序列化器,该序列化器是被序列化模型的一部分。

{ 
   "student_name": "Foobar",
   "department": 1,
   "custom_fields": [
       {'field_name': 'Email', 'field_value': 'foo@mail.com'},
       {'field_name': 'Roll No': 'fiel_value': '124'}
   ]
}

我在custom_fields以上的响应是模型Student的一部分。这些字段将根据传递的department而变化。

当我尝试如下所示时。

class CustomFieldSerializer(serializer.Serializer):
   field_name = serializers.CharField()
   field_value = serializers.CharField()

class StudentSerializer(serializer.ModelSerializer):
    custom_fields = CustomFieldSerializer()
    class Meta:
        model = Student
        fields = ("student_name", "department", "custom_fields")    

serializer = StudentSerializer(instance=student)

由于custom_fields不是序列化程序的一部分,因此出现

之类的错误
  

Student对象没有名为custom_fields的属性。

为防止该错误,我遵循的approach用于读取操作,如下所述,我在to_representation中创建了SerializerMethodField字段,在to_internal_value中创建了List字段,如下所示

class StudentSerializer(serializer.ModelSerializer):
    class Meta:
        model = Student
        fields = ("student_name", "department")    

    def to_repesentation(self, instance):
        self.fields['custom_fields'] = serializers.SerializerMethodField()
        return super().to_representation(instance)

    def to_internal_value(self, data):
        self.fields["custom_fields"] = serializers.ListField(child=CustomFieldSerializer)
        return super().to_internal_value()

 def get_custom_fields(self, obj):
     # method used for serialization
     return [
       {'field_name': 'email', field_value: ''}, 
       {'field_name': 'Roll No', 'field_value': ''}
     ]

这是正确的方法还是有更好的选择?

1 个答案:

答案 0 :(得分:0)

您无需为此覆盖to_repesentation()to_internal_value(),只需将 CustomFieldSerializer() 设置为{{3 }}将解决问题。

#serializers.py
class StudentSerializer(serializer.ModelSerializer):
    custom_fields = CustomFieldSerializer(write_only=True)

    class Meta:
        model = Student
        fields = ("student_name", "department", "custom_fields")