Django REST partial_update

时间:2017-02-14 18:15:42

标签: python angularjs django django-rest-framework

我尝试使用angular $ http。

在DRF中执行部分更新

在我的DRF模型视图集中,我覆盖了partial_update函数(服务器端)。

class AnimalTreatmentViewSet(viewsets.ModelViewSet):
    queryset = MyObject.objects.all()
    serializer_class = MyObjectSerializer

    def create(self, request):
        # It works with $http.post()
        pass

    def update(self, request, pk=None):
        # It works with $http.put()
        pass

    def list(self, request):
        # It works with $http.get()
        pass

    def partial_update(self, request, pk=None):
        # This one wont work with $http.patch()
        instance = self.get_object()
        serializer = self.serializer_class(instance, data=request.data, partial=True)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在客户端角度处理用户请求。

$http.patch('/api/my_viewset_url/1', data);

但我得到了这个回复方法不允许(PATCH):/ api / my_viewset_url / 1

  

$http.get()请求与DRF模型视图集list(self, request)一起使用时,适用于$http.post() def create(self, request)创建对象和$http.put()的列表相同使用def update(self, request)更新对象。

出了什么问题?或者DRF模型视图集中partial_update的正确http动词是什么

1 个答案:

答案 0 :(得分:0)

似乎URL缺少尾部斜杠。

相关documentation

  

默认情况下,SimpleRouter / DefaultRouter创建的URL附加了一个   尾随斜线。在实例化路由器时,可以通过将trailing_slash参数设置为False来修改此行为。例如:

router = routers.DefaultRouter(trailing_slash=False)