You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:39:34