Django使用request.POST保存采集数据时出现带引号方括号的格式问题
Django数据存储携带引号方括号问题解决
根因分析
你遇到的存储格式异常是因为requests.post默认使用application/x-www-form-urlencoded格式传递参数,该格式不支持嵌套列表/数组类型,代码中主动给precedents、users字段套了方括号,传递时会被requests自动序列化为字符串格式的列表(如"['test']"),后端直接存储该字符串就会出现带引号和方括号的结果。
排查步骤
- 先打印请求发送前的构造参数
print(data),确认字段是否被额外套了列表结构 - 打印请求实际发送的报文内容
print(answer.request.body),确认发送时是否已经被转为字符串格式的列表 - 后端接口处打印接收到的参数
print(request.POST)(form格式)或print(request.data)(JSON格式),确认接收侧拿到的参数类型是否符合预期 - 检查数据库对应字段的类型,以及后端序列化器的字段定义,确认是否和传递的参数类型匹配
解决方案
根据后端接口的接收格式选择对应方案:
方案1:后端接口支持JSON传参(推荐)
将requests.post的data参数替换为json参数,自动设置请求头为application/json,保留列表类型不会被强制转成字符串:
# 改前 answer = requests.post(url, data=data, headers={'Authorization': 'Token ' + request.session['user_token']}) # 改后 answer = requests.post(url, json=data, headers={'Authorization': 'Token ' + request.session['user_token']})
方案2:后端接口仅支持form格式传参
- 如果对应字段是字符串类型,不需要存储列表,直接去掉参数外层的方括号即可:
# 改前 "precedents": [request.POST['precedent_list']], "users": [1], # 改后 "precedents": request.POST['precedent_list'], "users": 1,
- 如果对应字段是数组类型需要存储列表,可将列表转为逗号分隔的字符串传递,后端接收后再用
split方法还原为列表,或者后端接收后通过ast.literal_eval将字符串格式的列表转为真实列表。
方案3:后端序列化/存储逻辑修正
如果确认传参格式正确,检查后端序列化器字段定义是否匹配:如果要存储列表,需使用ListField(DRF)或ArrayField(PostgreSQL),不要用CharField接收列表类型参数,避免自动转储为字符串。
内容的提问来源于stack exchange,提问作者searcher__dm01
相关产品推荐
相关产品推荐

