Django Rest Framework:移除列表参数末尾的[]后缀
解决DRF中列表参数转换后末尾带
[]的问题 问题原因
当前端以URL查询参数形式发送列表(如dataList[]=["1","2","3"])时,djangorestframework-camel-case会将dataList转换为data_list,但保留了末尾的[],导致后端接收到的键为data_list[],而非预期的data_list。
解决方案
方案1:自定义参数转换逻辑
重写djangorestframework-camel-case的驼峰转蛇形函数,自动移除键末尾的[]:
- 在项目中创建自定义工具模块(比如
utils/case_conversion.py):
from djangorestframework_camel_case.util import camel_to_snake def custom_camel_to_snake(name): # 先移除末尾的[],再执行驼峰转蛇形转换 if name.endswith("[]"): name = name[:-2] return camel_to_snake(name)
- 在
settings.py中配置DRF使用自定义转换函数:
REST_FRAMEWORK = { # 其他原有配置... 'JSON_UNDERSCOREIZE': { 'no_underscore_before_number': True, 'transform_function': 'utils.case_conversion.custom_camel_to_snake' }, 'DEFAULT_QUERY_PARAMETER_RENDERER_CLASSES': [ 'djangorestframework_camel_case.render.CamelCaseJSONRenderer', ], 'DEFAULT_PARSER_CLASSES': [ 'djangorestframework_camel_case.parser.CamelCaseJSONParser', ], }
方案2:自定义查询参数解析器
如果问题仅出在URL查询参数解析环节,可自定义解析器处理带[]的键:
from rest_framework.parsers import QueryParser from djangorestframework_camel_case.util import camel_to_snake class CustomQueryParser(QueryParser): def parse(self, stream, media_type=None, parser_context=None): raw_data = super().parse(stream, media_type, parser_context) cleaned_data = {} for key, value in raw_data.items(): # 处理带[]后缀的键 if key.endswith("[]"): cleaned_key = camel_to_snake(key[:-2]) cleaned_data[cleaned_key] = value else: cleaned_key = camel_to_snake(key) cleaned_data[cleaned_key] = value return cleaned_data
然后在settings.py中替换默认解析器:
REST_FRAMEWORK = { # 其他原有配置... 'DEFAULT_PARSER_CLASSES': [ 'your_app.parsers.CustomQueryParser', 'djangorestframework_camel_case.parser.CamelCaseJSONParser', ], }
方案3:前端请求格式调整(可选)
如果前端可修改请求方式,建议发送JSON格式请求而非表单查询参数。此时列表参数会以dataList: ["1","2","3"]的形式传递,djangorestframework-camel-case会直接转换为data_list,不会出现[]后缀问题。
验证
修改配置后重新发送请求,后端接收到的参数字典键应为data_list,对应值为列表["1","2","3"],可正常用于后续业务逻辑。
内容的提问来源于stack exchange,提问作者Eddysanoli
相关产品推荐
相关产品推荐

