如何让DRF序列化器从蛇形命名字段映射到小驼峰字段?
解决方案
1. 直接使用source参数(最简洁方案)
你之前误解了source的适用范围——它完全支持字典类型的输入数据,并非只限于模型序列化器。只需要在字段定义时指定source为对应的蛇形键名即可:
from rest_framework import serializers class SomeSerializer(serializers.Serializer): someField = serializers.CharField(source='some_field')
验证代码:
data = {'some_field': 'I love python'} serialized_data = SomeSerializer(data=data) serialized_data.is_valid() # 返回 True print(serialized_data.data['someField']) # 输出 'I love python'
2. 重写to_internal_value批量处理字段映射
如果有大量字段需要做驼峰/蛇形转换,手动加source太繁琐,可以重写序列化器的to_internal_value方法,先统一转换键名格式:
class CamelCaseSerializer(serializers.Serializer): def to_internal_value(self, data): # 蛇形转驼峰工具函数 def snake_to_camel(s): parts = s.split('_') return parts[0] + ''.join(p.capitalize() for p in parts[1:]) # 转换所有输入键名 camel_data = {snake_to_camel(k): v for k, v in data.items()} return super().to_internal_value(camel_data) # 继承基类使用 class SomeSerializer(CamelCaseSerializer): someField = serializers.CharField() anotherField = serializers.IntegerField()
输入{'some_field': 'test', 'another_field': 123}时,会自动映射到对应的驼峰字段。
3. 自定义通用字段类(灵活扩展)
如果需要对特定字段做额外逻辑控制,可以自定义字段类处理键名映射:
class CamelCaseField(serializers.Field): def __init__(self, snake_field_name, **kwargs): self.snake_field_name = snake_field_name super().__init__(**kwargs) def get_attribute(self, instance): # 兼容字典和模型实例两种数据源 return instance.get(self.snake_field_name) if isinstance(instance, dict) else getattr(instance, self.snake_field_name) # 使用示例 class SomeSerializer(serializers.Serializer): someField = CamelCaseField(snake_field_name='some_field', max_length=100)
内容的提问来源于stack exchange,提问作者Vladimir Kolenov
相关产品推荐
相关产品推荐

