You need to enable JavaScript to run this app. Django REST Framework如何从request中获取同名多个参数值
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework如何从request中获取同名多个参数值

问题原因

Django REST Framework 中的 request.query_params 和表单类型的 request.data 本质都是 Django 自带的 QueryDict 结构,这类结构针对同名参数默认做了合并处理,使用普通的 get() 方法取值时只会返回最后一个传入的参数值,所以才会出现只输出 cool 的问题。


正确获取方式

GET请求场景

直接使用 QueryDict 提供的 getlist() 方法,传入参数名即可拿到全部同名参数组成的列表:

genres = request.query_params.getlist('genre')

你之前用 list(request.query_params.get("genre")) 写法错误的原因是,get() 已经拿到了最后一个字符串值 cool,再转列表会把字符串拆分为单个字符的列表,自然不符合预期。

POST请求场景

分两种传参格式处理:

  • 若POST请求是 application/x-www-form-urlencoded 或 multipart/form-data 表单格式传参,和GET逻辑一致,用 getlist() 取值:
    genres = request.data.getlist('genre')
    
  • 若POST请求是 application/json 格式传参,JSON本身支持数组类型,直接在请求体中传入 {"genre": ["test", "cool"]},直接正常取值即可拿到列表:
    genres = request.data.get('genre')
    

完整示例代码

@api_view(['POST', 'GET'])
def getParamAjax(request):
    genres = []
    if request.method == 'GET':
        genres = request.query_params.getlist('genre')
    elif request.method == 'POST':
        # 表单格式使用下方注释的代码
        # genres = request.data.getlist('genre')
        # JSON格式直接取值
        genres = request.data.get('genre', [])
    print(genres)

补充说明:你写的测试地址 localhost/api/genre=test 格式有误,路径和参数之间需要加 ? 分隔,正确的测试地址应为 localhost/api?genre=test&genre=cool。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 00:15:04