Django Rest Framework如何更新SerializerMethodField [英] Django Rest Framework How to update SerializerMethodField

查看:318
本文介绍了Django Rest Framework如何更新SerializerMethodField的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的序列化器:

I have a serializer like this:

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)。

I used this to display "Male" and "Female"(insted of "M" of "F") while performing GET request.

这很好。

但是现在我正在为模型编写补丁方法,并且 SerializerMethodField()具有 read_only = True 。所以我没有在 serializer.validated_data()中获得性别字段的值传递。如何解决这个问题?

But now I am writing an patch method for the model and SerializerMethodField() has read_only=True. So I am not getting value passed for gender field in serializer.validated_data(). How to overcome this issue?

推荐答案

因此,如果我对您的理解正确,则希望发送{'gender':'Male'

So if I understand you correctly, you want to send {'gender': 'Male'} in your PATCH request.

因此,您必须告诉序列化程序如何将表示形式(即男性)转换为内部值。

Therefor, you have to tell your serializer how to convert your representation i.e. 'Male' into the internal value.

您可以请参见源代码,SerializerMethodField仅涵盖从内部值到表示形式的转换。

As you can see in source, SerializerMethodField only covers the conversion from internal value to the representation.

您可以实现自定义的SerializerField来执行必要的转换。天真的实现可能是这样的:

You can implement a custom SerializerField that performs the necessary conversions. A naive implementation could something like this:

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

Note that this untested and lacks any validation, check out the DRF docs on custom fields.

这篇关于Django Rest Framework如何更新SerializerMethodField的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆