我有一个要使用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,该API返回CamelCase中的值(“ FirstName”,“ LastName”等),我需要验证和修改键名以使用蛇形大小写。我希望我可以使用独立的序列化程序,并在序列化程序中转换名称。我没有必须转换的数据模型。
答案 0 :(得分:1)
您可以使用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界面之外的管理命令或其他地方使用这些模型,则以这种方式进行操作可以使您对数据库进行有效的控制。
您还可以进行预保存的挂钩:
class Foo(models.model):
def save(self, *args, **kwargs):
if self.bar:
self.bar = self.bar.lower()
super().save(*args, **kwargs)
答案 1 :(得分:0)
尝试一下:
class UserSerializer(serializers.Serializer):
FirstName = serializers.CharField(source="first_name")
LastName = serializers.CharField(source="last_name")
用法(序列化):
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' }