向Django API发送嵌套字典时为何被解析为数组?
问题原因
Django测试客户端(self.client)默认会把传入的data参数按照**表单编码格式(application/x-www-form-urlencoded)**发送,这种格式不支持嵌套字典结构。当你传入嵌套字典时,客户端会把内层字典的键(A、B、C)当成外层键test的数组值来序列化,所以后端收到的request.data里test对应的是['A','B','C']。
解决方案1:发送JSON格式数据
手动将嵌套字典序列化为JSON字符串,同时设置请求的content_type为application/json,后端就能正确解析嵌套结构。
修改发送代码:
import json data = { "test":{ "A":"Adata", "B":"Bdata", "C":"Cdata" } } response = self.client.post( "/api_patch/", data=json.dumps(data), content_type="application/json", follow=True )
此时后端打印的request.data会是正常的嵌套字典:
request.data {'test': {'A': 'Adata', 'B': 'Bdata', 'C': 'Cdata'}} request.data type <class 'dict'>
解决方案2:使用DRF的APIClient
如果项目依赖Django REST Framework,直接用APIClient替代默认测试客户端,它会自动处理JSON格式的嵌套数据,无需手动序列化。
先导入客户端:
from rest_framework.test import APIClient
修改测试代码:
client = APIClient() data = { "test":{ "A":"Adata", "B":"Bdata", "C":"Cdata" } } response = client.post("/api_patch/", data, follow=True)
这样后端同样能正确接收嵌套字典结构。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

