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

如何在Django REST Framework中将snake_case模型字段序列化为camelCase

实现snake_case到camelCase的全局转换

方案一:自定义基础序列化器类(推荐,支持序列化+反序列化)

通过创建一个通用的基类序列化器,让所有业务序列化器继承它,自动完成字段名的格式转换,无需逐个字段配置。

  1. 先实现蛇形命名转驼峰命名的工具函数:
def snake_to_camel(snake_str):
    components = snake_str.split('_')
    # 首单词小写,后续单词首字母大写拼接
    return components[0] + ''.join(x.title() for x in components[1:])
  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
  1. 业务序列化器直接继承这个基类即可:
class UserSerializer(CamelCaseModelSerializer):
    class Meta:
        model = User
        fields = ["id", "user_name", "email_address"]

这样序列化输出的字段会变成id、userName、emailAddress,同时接收请求时传camelCase格式的参数也能自动映射到模型的snake_case字段。

方案二:自定义JSON渲染器(仅处理响应输出)

如果只需要在API响应中输出camelCase格式,不需要处理请求参数的转换,可以在渲染阶段统一修改键名。

  1. 实现自定义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)
  1. 在项目settings.py中全局配置该渲染器:
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'your_app.renderers.CamelCaseJSONRenderer',  # 替换为你的渲染器路径
        'rest_framework.renderers.BrowsableAPIRenderer',  # 保留浏览器可浏览API功能
    ],
}

这个方案仅修改响应输出格式,请求参数仍需以snake_case格式提交。

内容的提问来源于stack exchange,提问作者Geekmard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:27:06