Django Rest Framework如何更新SerializerMethodField

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文档.

  • 你为什么要使用它之前创建字典的副本?woudn't`返回VALUE_MAP [数据]`还工作吗? (2认同)