Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django Rest框架中修改序列化程序中的字段名_Python_Django Rest Framework_Serialization - Fatal编程技术网

Python 在Django Rest框架中修改序列化程序中的字段名

Python 在Django Rest框架中修改序列化程序中的字段名,python,django-rest-framework,serialization,Python,Django Rest Framework,Serialization,我想用DRF的序列化程序序列化一个对象,但我想规范化一些字段名。我想我可以使用source属性来实现这一点: user = { 'FirstName': 'John', 'LastName': 'Doe' } serialized = UserSerializer(data=user) class UserSerializer(serializers.Serializer): first_name = serializers.CharField(source="FirstName")

我想用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")
但是,我不知道如何访问传入的数据对象-有没有一种方法不创建新方法或某种复杂的
super()
调用

编辑:


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

您可以通过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')
如果您需要在管理命令或除DRF接口之外的其他地方使用这些模型,那么通过这种方式可以对DB进行消毒控制

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

class Foo(models.model):
    def save(self, *args, **kwargs):
        if self.bar:
            self.bar = self.bar.lower()
        super().save(*args, **kwargs)
试试这个:

class UserSerializer(serializers.Serializer):
    FirstName = serializers.CharField(source="first_name")
    LastName = serializers.CharField(source="last_name")
用法(序列化):

用法(反序列化):


这是有道理的,但这不是一个模型序列化程序吗?我假设
source
属性不是实现这一点的方法。是的,您必须这样做:
f=Foo();f、 消毒棒=‘baz’
。另一种方法是实现预保存钩子,但在使用模型实例之前,必须先保存模型实例。您还可以将
bar
设置为属性,并使用
bar\u private
对其进行阴影处理,这样名称就不那么容易混淆了。好的。。我希望有一个简单的解决方案我错过了-我会研究切换东西,谢谢。这似乎很有用-但我的印象是,在序列化程序中的字段应该是我想要的字段名-而不是相反。我为这个问题添加了一个用例,希望能澄清这个问题。我仍然可以用您的答案在snake case中声明我的序列化程序字段吗?drf尝试使用序列化程序中声明的名称获取每个字段的值,因此您必须根据该API返回数据中的名称命名字段。
class Person:
    first_name = "first name"
    last_name = "last name"

person1 = Person()
serialized_data = UserSerializer(person1).data # = {"FirstName": "first name", "LastName": "last name"}
data = { 'FirstName': 'John', 'LastName': 'Doe' }
serializer = UserSerializer(data=data)
serializer.is_valid()
valid_deserialized_data = serializer.validated_data # = { 'first_name': 'John', 'last_name': 'Doe' }