Handle Nested Serializer Что не является частью модели? - PullRequest
0 голосов
/ 30 мая 2019

Я хочу использовать вложенный сериализатор для чтения / записи, который является частью сериализуемой модели.,

{ 
   "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': ''}
     ]

Это правильный подход или есть лучшая альтернатива?

1 Ответ

0 голосов
/ 30 мая 2019

Для этого вам не нужно переопределять to_repesentation() или to_internal_value(), все, что вам нужно сделать, это установить CustomFieldSerializer() как write_only=True решит проблему.

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

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