我有以下代码
class UserPollPassedView(generics.UpdateAPIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = UsersPollUpdateSerializer
def update(self, request, *args, **kwargs):
request.data['date_passed'] = datetime.datetime.now()
request.data['passed'] = True
return super(UserPollPassedView, self).update(request, *args, **kwargs)
当我尝试通过像hurl.it这样的卷曲工具访问此方法时,我得到QueryDict is immutable
错误,因为我试图修改request.data
的内容,假设请求是Django- rest的Request
对象,但事实并非如此,它实际上是原生的Django HttpRequest
对象。当我在请求标头中明确定义Content-type: application\json
时,它会给我另一个JSON parse error
。当我使用httpie工具时,一切都顺利和干净,但默认情况下它会发送相同的application\json
标头。我想,差异仍在标题中,但我无法理解究竟应该改变什么。
我还尝试通过在访问request
之前添加以下行来明确地从HttpRequest
到Request
进行类型转换request.data
request = self.initialize_request(request)
但没有用,即使"JSON parse error - Expecting value: line 1 column 1 (char 0)"
最初是来自httpie的request
对象,它也会提供相同的Request
。
欣赏任何线索
答案 0 :(得分:0)
我不知道为什么你认为该对象不是DRF请求。由于您使用的是DRF视图,因此会收到DRF请求。 Django自己的请求对象甚至没有data
属性。
答案 1 :(得分:0)
request
变量肯定持有DRF Request
对象,而不是Django HttpRequest
对象。如果不是这种情况,您会收到data
上HttpRequest
不存在的错误。
问题是当数据作为表单数据(例如通过浏览器)提交时,request.data
是QueryDict
object,这应该接近于从request.POST
/获得的数据request.GET
/ request.FILES
。这可能是您认为它是Django HttpRequest
的原因,因为这通常是人们在尝试修改这些对象后看到的问题。
您正在尝试修改不推荐的request.data
,并且应该将其视为不可变字典。通常,这表示您应该在其他位置设置这些密钥,通常在序列化程序层上或通过覆盖perform_update
作为挂钩),而不是修改传入的请求数据。