django 按键名从dict填充drf序列化程序属性

ruarlubt  于 2023-02-20  发布在  Go
关注(0)|答案(2)|浏览(112)

假设我有一个序列化器,它具有较低的以 Camel 命名的字段,我必须通过约定来保留这些字段:

class SomeSerializer(serializers.Serializer):
    someField = serializers.CharField()

我有下面的数据要序列化,我想在snake的情况下保留键名称,以遵循惯例:

data = {'some_field': 'I love python'}

我希望序列化程序从dict some_field键的值填充其someField

serialized_data = SomeSerializer(data=data)
serialized_data.is_valid()
serialized_data.data['someField'] == 'I love python'

我已经试过了:
DRF串行器源代码-似乎适用于基于模型的串行器?
DRF串行化器方法字段-似乎很难应用时,有几个不同格式的字段-字符字段,日期字段,intfields和所有我需要的只是从dict拉值
自定义渲染器-但它们是在序列化后应用的,验证将失败并影响整个视图
还有别的建议吗?

c9x0cxw0

c9x0cxw01#

可以使用serializers.SerializerMethodField()从字典中获取值,而不是使用serializers.CharField()

class SomeSerializer(serializers.Serializer):
someField = serializers.SerializerMethodField()

def get_someFiled(self, obj: Dict):
    return obj.get('some_field', None)
s71maibg

s71maibg2#

看起来您的客户端应用程序以camelCase发送数据,但您希望处理为python方言。
首先我要你创建camel_case_to_snake_case函数
然后:
让序列化程序保持这样

class SomeSerializer(serializers.Serializer):
    someField = serializers.CharField()

但是重写了序列化器中的to_internal_value方法。使它看起来像那样

def to_internal_value(self, data):
  res = {}
  for k, v in data.items():
    res[camel_case_to_snake_case(k)] = v
  return super().to_internal_value(res)

相关问题