【问题标题】:Renaming DRF serializer fields重命名 DRF 序列化器字段
【发布时间】:2019-01-22 10:09:54
【问题描述】:

我正在使用 DRF 序列化程序来验证我从 JSON API 检索的传入数据。我正在尝试从响应中重命名一些笨拙命名的字段,以便更容易在我的代码中进一步使用serializer.data

从 API 接收的数据如下所示:

{"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')

有没有办法在不恢复到SerializerMethodField 的情况下实现这一目标?

【问题讨论】:

标签: python serialization django-rest-framework


【解决方案1】:

您可以重写 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

希望对你有帮助。

【讨论】:

  • 好的,谢谢!我稍微编辑了您的答案,第二个解决方案只允许更改序列化程序中的数据,而不是字段名称,所以我删除了 t (不适用于问题)。
猜你喜欢
  • 2021-03-19
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多