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
相关产品推荐
相关产品推荐

