Kis*_*han 9 python django django-serializer django-rest-framework
我有这样的序列化器:
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()
Run Code Online (Sandbox Code Playgroud)
我在执行GET请求时使用它来显示"男性"和"女性"("F"的"M").
这很好用.
但现在我正在为模型编写补丁方法并且SerializerMethodField()已经read_only=True.所以我没有为性别领域获得价值serializer.validated_data().如何克服这个问题?
Dan*_*per 15
因此,如果我理解正确,您需要在PATCH请求中发送{'gender':'Male'}.
因此,您必须告诉序列化器如何将您的表示(即"男性")转换为内部值.
正如您在源代码中看到的,SerializerMethodField仅涵盖从内部值到表示的转换.
您可以实现执行必要转换的自定义SerializerField.一个天真的实现可能是这样的:
class GenderSerializer(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 = GenderSerializer()
...
Run Code Online (Sandbox Code Playgroud)
请注意,此未经测试且缺少任何验证,请查看自定义字段上的DRF文档.
| 归档时间: |
|
| 查看次数: |
4672 次 |
| 最近记录: |