如何在Django Rest Framework中将POST的PascalCase JSON转为snake_case?
让DRF端点接受PascalCase请求体的解决方案
针对你的Django 4.1 + DRF 3.14 + Python 3.11环境,有两种可靠的方法实现需求:
方法一:使用第三方库(推荐,简单高效)
djangorestframework-camel-case是DRF生态中专门处理驼峰/蛇形字段转换的库,能自动处理嵌套结构的转换。
- 安装库
pip install djangorestframework-camel-case
- 全局配置解析器
在项目的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解析器(无依赖,灵活可控)
如果不想引入第三方库,可以自定义解析器实现字段名转换:
- 编写转换工具函数
在项目的工具模块(如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
- 自定义解析器类
在同一文件中定义自定义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)
- 应用解析器
- 局部应用:在单个视图类中指定使用该解析器
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
相关产品推荐
相关产品推荐

