我想使用读/写嵌套序列化器,该序列化器是被序列化模型的一部分。
{
"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': ''}
]
这是正确的方法还是有更好的选择?
答案 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")