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

如何在Django Rest Framework中将POST的PascalCase JSON转为snake_case?

让DRF端点接受PascalCase请求体的解决方案

针对你的Django 4.1 + DRF 3.14 + Python 3.11环境,有两种可靠的方法实现需求:

方法一:使用第三方库(推荐,简单高效)

djangorestframework-camel-case是DRF生态中专门处理驼峰/蛇形字段转换的库,能自动处理嵌套结构的转换。

  1. 安装库
pip install djangorestframework-camel-case
  1. 全局配置解析器
    在项目的settings.py中修改REST_FRAMEWORK配置,替换默认的JSON解析器为驼峰格式解析器:
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'djangorestframework_camel_case.parser.CamelCaseJSONParser',
        # 保留其他默认解析器以支持表单等请求
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ),
    # 若需要返回PascalCase格式的响应,可添加对应渲染器
    # 'DEFAULT_RENDERER_CLASSES': (
    #     'djangorestframework_camel_case.render.CamelCaseJSONRenderer',
    #     'rest_framework.renderers.BrowsableAPIRenderer',
    # ),
}

配置完成后,你的API端点会自动将PascalCase格式的请求体(包括嵌套的ScanModel、TimerConfiguration等结构)转换为DRF序列化器期望的snake_case格式,无需修改现有序列化器或视图逻辑。

方法二:自定义JSON解析器(无依赖,灵活可控)

如果不想引入第三方库,可以自定义解析器实现字段名转换:

  1. 编写转换工具函数
    在项目的工具模块(如utils/parsers.py)中添加以下代码:
def pascal_to_snake(s: str) -> str:
    """将PascalCase字符串转换为snake_case"""
    return ''.join(['_' + c.lower() if c.isupper() else c for c in s]).lstrip('_')

def convert_keys_to_snake_case(data):
    """递归处理字典/列表,将所有键转换为snake_case"""
    if isinstance(data, dict):
        return {pascal_to_snake(k): convert_keys_to_snake_case(v) for k, v in data.items()}
    elif isinstance(data, list):
        return [convert_keys_to_snake_case(item) for item in data]
    else:
        return data
  1. 自定义解析器类
    在同一文件中定义自定义JSON解析器:
from rest_framework.parsers import JSONParser

class PascalCaseJSONParser(JSONParser):
    def parse(self, stream, media_type=None, parser_context=None):
        # 先解析原始JSON数据
        raw_data = super().parse(stream, media_type, parser_context)
        # 转换字段名为snake_case
        return convert_keys_to_snake_case(raw_data)
  1. 应用解析器
  • 局部应用:在单个视图类中指定使用该解析器
from rest_framework.views import APIView
from utils.parsers import PascalCaseJSONParser

class YourScanAPIView(APIView):
    parser_classes = [PascalCaseJSONParser]
    
    def post(self, request):
        # request.data已自动转换为snake_case格式
        # 后续逻辑无需修改
        return Response({"status": "success"})
  • 全局应用:参考方法一的settings配置,将DEFAULT_PARSER_CLASSES中的解析器替换为自定义的PascalCaseJSONParser即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:30:41