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

Django Rest Framework:移除列表参数末尾的[]后缀

解决DRF中列表参数转换后末尾带[]的问题

问题原因

当前端以URL查询参数形式发送列表(如dataList[]=["1","2","3"])时,djangorestframework-camel-case会将dataList转换为data_list,但保留了末尾的[],导致后端接收到的键为data_list[],而非预期的data_list。

解决方案

方案1:自定义参数转换逻辑

重写djangorestframework-camel-case的驼峰转蛇形函数,自动移除键末尾的[]:

  1. 在项目中创建自定义工具模块(比如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)
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:32:15