重命名DRF序列化器字段

时间:2019-01-22 10:09:54

标签: python serialization django-rest-framework

我正在使用DRF序列化程序来验证从JSON API检索的传入数据。我正在尝试从响应中重命名一些笨拙的字段,以便更轻松地在代码中进一步使用const actual: ActualExperience = { actual: true, employ: 'my last employ', start: new Date() }

从API接收的数据如下:

serializer.data

并处理代码:

{"FunnyNamedField": true, "AnotherWeirdField": false}

我希望序列化程序将输入的字段名称转换为更简洁的名称。 resp = requests.get([...]) resp.raise_for_status() ser = MyFunnyDataSerializer(data=resp.json()) if ser.is_valid(): do_domething_with(ser.data) 看起来像:ser.data

我尝试过但无法按预期进行的操作:

{'funny': True, 'weird': False}

有什么方法可以实现而无需恢复为class MyFunnyDataSerializer(serializers.Serializer): funny = serializers.Booleanfield(source='FunnyNamedField')

1 个答案:

答案 0 :(得分:0)

您可以重写BaseSerializer来实现:

from rest_framework import serializers

class CustomSerializer(serializers.BaseSerializer):

    def to_representation(self, instance):
        return {
            <datas>
        }

您可以使用自定义方法对实例序列化进行一些特定的修改。

另一种解决方案可能是为一个字段Field Validator Method写自己的验证器。

因此,在此文档示例中,您可以在返回值之前对其进行修改。

from rest_framework import serializers

class BlogPostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    content = serializers.CharField()

    def validate_title(self, value):
        """
        Check that the blog post is about Django.
        """
        if 'django' not in value.lower():
            raise serializers.ValidationError("Blog post is not about Django")
        if value == "something":
            value = "something_else"
        return value

希望有帮助。