This QueryDict instance is immutable

用django开发接口,用postman测的好好的,前端反馈请求一直500,奇了怪了,查看请求确实有报错:This QueryDict instance is immutable。

开启调试,在修改请求体的时候报错了,实例如下:

1
2
3
4
5
6
7
8
def create(self, request, *args, **kwargs):
# 获取状态
case_status = 1 if request.query_params.get("status", '1') == "1" else 2
# 更新data
data = request.data
data["status"] = case_status
# 删除推荐
data.pop("recommend", None)

解决方案

查阅官方文档,发现QueryDict实例变成一个不可修改。

官方解释

在正常的请求/响应周期中访问时,QueryDicts request.POST和request.GET将是不可变的。要获得可变版本,您需要使用QueryDict.copy()。

方案一:

1
2
3
4
5
6
7
8
def create(self, request, *args, **kwargs):
# 获取状态
case_status = 1 if request.query_params.get("status", '1') == "1" else 2
# 更新data
data = request.data.copy()
data["status"] = case_status
# 删除推荐
data.pop("recommend", None)

方案二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def create(self, request, *args, **kwargs):
# 获取状态
case_status = 1 if request.query_params.get("status", '1') == "1" else 2
# 更新data
data = request.data
# 记住旧的方式
_mutable = data._mutable
# 设置_mutable为True
data._mutable = True
data["status"] = case_status
# 删除推荐
data.pop("recommend", None)
# 恢复_mutable原来的属性
data._mutable = _mutable