如何在Django REST Framework中将snake_case模型字段序列化为camelCase
实现snake_case到camelCase的全局转换
方案一:自定义基础序列化器类(推荐,支持序列化+反序列化)
通过创建一个通用的基类序列化器,让所有业务序列化器继承它,自动完成字段名的格式转换,无需逐个字段配置。
- 先实现蛇形命名转驼峰命名的工具函数:
def snake_to_camel(snake_str): components = snake_str.split('_') # 首单词小写,后续单词首字母大写拼接 return components[0] + ''.join(x.title() for x in components[1:])
- 自定义基础序列化器,重写
get_fields方法处理字段名映射:
from rest_framework import serializers class CamelCaseModelSerializer(serializers.ModelSerializer): def get_fields(self): # 先获取父类生成的所有字段 fields = super().get_fields() camel_case_fields = {} for snake_name, field in fields.items(): camel_name = snake_to_camel(snake_name) camel_case_fields[camel_name] = field # 绑定原字段名作为source,确保反序列化时能正确映射到模型字段 field.source = snake_name return camel_case_fields
- 业务序列化器直接继承这个基类即可:
class UserSerializer(CamelCaseModelSerializer): class Meta: model = User fields = ["id", "user_name", "email_address"]
这样序列化输出的字段会变成id、userName、emailAddress,同时接收请求时传camelCase格式的参数也能自动映射到模型的snake_case字段。
方案二:自定义JSON渲染器(仅处理响应输出)
如果只需要在API响应中输出camelCase格式,不需要处理请求参数的转换,可以在渲染阶段统一修改键名。
- 实现自定义JSON渲染器:
from rest_framework.renderers import JSONRenderer class CamelCaseJSONRenderer(JSONRenderer): def render(self, data, accepted_media_type=None, renderer_context=None): # 递归处理嵌套结构(字典、列表)的键名转换 def convert_keys(obj): if isinstance(obj, dict): return {snake_to_camel(k): convert_keys(v) for k, v in obj.items()} elif isinstance(obj, list): return [convert_keys(item) for item in obj] else: return obj # 转换后再调用父类的渲染方法 camel_case_data = convert_keys(data) return super().render(camel_case_data, accepted_media_type, renderer_context)
- 在项目settings.py中全局配置该渲染器:
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'your_app.renderers.CamelCaseJSONRenderer', # 替换为你的渲染器路径 'rest_framework.renderers.BrowsableAPIRenderer', # 保留浏览器可浏览API功能 ], }
这个方案仅修改响应输出格式,请求参数仍需以snake_case格式提交。
内容的提问来源于stack exchange,提问作者Geekmard
相关产品推荐
相关产品推荐

