Django Rest Framework如何更新SerializerMethodField
问题内容:
我有一个这样的序列化器:
class PersonSerializer(serializers.ModelSerializer):
gender = serializers.SerializerMethodField()
bio = BioSerializer()
class Meta:
model = Person
fields = UserSerializer.Meta.fields + ('gender', 'bio',)
def get_gender(self, obj):
return obj.get_gender_display()
在执行GET请求时,我用它来显示“男性”和“女性”(由“ F”的“ M”插入)。
这很好。
但是现在我正在为模型编写补丁方法,并SerializerMethodField()
具有read_only=True
。所以我没有得到性别领域的价值传递serializer.validated_data()
。如何克服这个问题?
问题答案:
因此,如果我对您的理解正确,那么您想在PATCH请求中发送{‘gender’:’Male’}。
因此,您必须告诉序列化器如何将您的表示形式(即“ Male”)转换为内部值。
如您在source中所见,SerializerMethodField仅涵盖从内部值到表示形式的转换。
您可以实现一个自定义SerializerField来执行必要的转换。天真的实现可能是这样的:
class GenderSerializerField(serializers.Field):
VALUE_MAP = {
'M': 'Male',
'F': 'Female'
}
def to_representation(self, obj):
return self.VALUE_MAP[obj]
def to_internal_value(self, data):
return {k:v for v,k in self.VALUE_MAP.items()}[data]
class PersonSerializer(serializers.ModelSerializer):
gender = GenderSerializerField()
...
请注意,这未经测试且缺乏任何验证,请查看有关自定义字段的DRF文档。