在 Django Rest Framework 中修改序列化程序中的字段名称

Tob*_*oby 5 python serialization django-rest-framework

我有一个对象,我想使用 DRF 的序列化程序进行序列化,但我想规范化一些字段名称。我想我可以使用该source属性来实现这一点:

user = { 'FirstName': 'John', 'LastName': 'Doe' }

serialized = UserSerializer(data=user)

class UserSerializer(serializers.Serializer):
    first_name = serializers.CharField(source="FirstName")
    last_name = serializers.CharField(source="LastName")
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何访问传入的数据对象 - 有没有不创建新方法或某种复杂super()调用的方法?

编辑:

用例:我正在使用一个 API,它返回 CamelCase 中的值('FirstName'、'LastName' 等),我需要验证并修改密钥名称为蛇形大小写。我希望我可以使用独立的序列化程序,并在序列化程序中转换名称。我没有必须转换的数据的模型。

Ehs*_*uri 5

尝试这个:

class UserSerializer(serializers.Serializer):
    FirstName = serializers.CharField(source="first_name")
    LastName = serializers.CharField(source="last_name")
Run Code Online (Sandbox Code Playgroud)

序列化:

class Person:
    first_name = "first name"
    last_name = "last name"

person1 = Person()
serialized_data = UserSerializer(person1).data # = {"FirstName": "first name", "LastName": "last name"}
Run Code Online (Sandbox Code Playgroud)

反序列化:

data = { 'FirstName': 'John', 'LastName': 'Doe' }
serializer = UserSerializer(data=data)
serializer.is_valid()
valid_deserialized_data = serializer.validated_data # = { 'first_name': 'John', 'last_name': 'Doe' }
Run Code Online (Sandbox Code Playgroud)


Ros*_*ers 2

您可以使用 Django 模型上的属性来实现此目的:

class Foo(models.model):
    bar = models.CharField(max_length=40)

    @property
    def sanitized_bar(self):
        print("Getting value")
        return self.bar.lower()



    @sanitized_bar.setter
    def sanitized_bar(self, value):
        self.bar = value.lower()

class FooSerializer(serializers.Serializer):
   bar = CharField(source='sanitized_bar')
Run Code Online (Sandbox Code Playgroud)

如果除了 DRF 接口之外,您还需要在管理命令或其他地方使用这些模型,那么这样做可以让您对数据库进行清理控制。

您还可以执行预保存挂钩:

class Foo(models.model):
    def save(self, *args, **kwargs):
        if self.bar:
            self.bar = self.bar.lower()
        super().save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 这是有道理的 - 但这不是模型序列化器是什么?我认为“source”属性不是实现此目的的方法。 (2认同)