Django调用request.data()报'QueryDict' object is not callable如何解决
错误根因与解决方案
1. 报错直接原因
'QueryDict' object is not callable 报错来源于你对request.data的错误调用:Django REST Framework中request.data是封装好的属性,不是可执行方法,你写的request.data()相当于尝试把QueryDict对象当做函数调用,自然抛出该错误。
2. QueryDict转字符串的正确方案
首先修正第一步的错误,把code = request.data()改为code = request.data拿到QueryDict对象,再根据你的业务需求选择转换方式:
- 如果你是要提取QueryDict中某个参数的字符串值(比如你代码中要用到的
code参数),直接取值即可,不用额外转换:code = request.data.get("code", "") - 如果你确实需要把整个QueryDict序列化为JSON字符串,先调用
.dict()转为普通Python字典,再用json.dumps(注意不要和写文件的json.dump搞混)处理:import json code = json.dumps(request.data.dict())
3. 修正后完整代码示例
class PreUpdateDeleteAPIView(APIView): serializer_class = PreEditSerializer queryset = Reserve.objects.all() def post(self, request): # 按提取单个code参数的场景举例 code = request.data.get("code", "") # 注意返回的字典要加key,不能只放url值 data = { "update_delete_url": reverse('update-delete', args = [code] ,request=request) } return Response(data)
额外注意点
- QueryDict本身支持一个参数对应多个值,直接序列化会出现所有参数值被包裹在列表中的情况,必须调用
.dict()转为普通单值字典后再序列化才能得到符合预期的结果。 - 原代码中返回的
data字典没有定义key,直接放reverse返回的URL会触发语法错误,上述示例已经补全key可以直接使用。
内容的提问来源于stack exchange,提问作者user15446178
相关产品推荐
相关产品推荐

