2017-02-14 116 views
1

我试着采用了棱角分明的$ HTTP的DRF进行部分更新正确的HTTP动词。什么是Django的REST partial_update

在我的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); 

但我得到这个响应不允许的方法(补丁):/ API/my_viewset_url/1

当使用$http.get()要求与DRF模型视图集中list(self, request)它运作良好,为获得相同的列表无二$http.post()def create(self, request)def update(self, request)更新对象创建对象和$http.put()

怎么了?或者是什么DRF模型正确的HTTP动词用于partial_update视图集中

+0

你使用的是模型视图吗?哪些mixins?你可以分享视图的其余部分吗?谢谢!! – bobleujr

+0

即时通讯使用modelviewset,谢谢你的回应! –

+0

@bobleujr我更新了我的问题 –

回答

0

这似乎是URL缺少结尾的斜线。

相关documentation

缺省情况下由SimpleRouter/defaultrouter中创建的网址被附加有 斜线。在实例化路由器时,可以通过将trailing_slash参数设置为False来修改此行为。例如:

router = routers.DefaultRouter(trailing_slash=False)