Я хочу использовать вложенный сериализатор для чтения / записи, который является частью сериализуемой модели.,
{
"student_name": "Foobar",
"department": 1,
"custom_fields": [
{'field_name': 'Email', 'field_value': 'foo@mail.com'},
{'field_name': 'Roll No': 'fiel_value': '124'}
]
}
I в ответе выше 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
i для операции чтения, я сделал поле SerializerMethodField в to_representation
и поле списка в to_internal_value
как показано ниже
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': ''}
]
Это правильный подход или есть лучшая альтернатива?