覆盖UpdateAPIView的更新方法

时间:2015-05-19 12:23:29

标签: python django-rest-framework

我需要在调用update()之前做一些操作。

我的代码

class CarView(generics.UpdateAPIView):
    permission_classes = (IsAdminUser,)
    serializer_class = CarSerializer

    def get_queryset(self):
        return ...

    def update(self, request, *args, **kwargs):
        # some actions
        super(CarView, self).update(request, *args, **kwargs) 

但我收到了错误

错误消息

  

预计会有ResponseHttpResponseHttpStreamingResponse   从视图返回,但收到<type 'NoneType'>

我该如何解决?

2 个答案:

答案 0 :(得分:3)

与大多数Django视图一样,update上的ViewSet方法应该返回响应。现在你没有返回任何东西,这就是为什么Django抱怨接收NoneType(因为那是默认的返回值)。

问题来自您update方法的最后一行,您调用的是父update但尚未将其返回。

super(CarView, self).update(request, *args, **kwargs)

如果你返回它,那么来自通常定义的update方法的响应将在链中传递并按照你期望的方式呈现。

return super(CarView, self).update(request, *args, **kwargs)

答案 1 :(得分:2)

这种情况正在发生,因为您的update方法中未返回任何内容。 Django视图期望返回Response个对象。只需在return方法中添加update即可。

class CarView(generics.UpdateAPIView):
    permission_classes = (IsAdminUser,)
    serializer_class = CarSerializer

    def get_queryset(self):
        return ...

    def update(self, request, *args, **kwargs):
        # some actions
        return super(CarView, self).update(request, *args, **kwargs) 

根据文件,

  

REST框架通过提供一个支持HTTP内容协商   响应类,允许您返回可以呈现的内容   多种内容类型,具体取决于客户端请求。

     

Response类是Django的SimpleTemplateResponse的子类。   响应对象使用数据初始化,数据应包含   原生Python原语。然后,REST框架使用标准HTTP   内容协商以确定它应如何呈现最终结果   回应内容。

因此,要将数据呈现为不同的内容类型,您必须返回响应。