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