无法在Django休息框架ModelViewSet中实现PUT

时间:2016-04-15 11:56:04

标签: django django-models django-views django-rest-framework

我有一个使用ModelViewSet实现的模型。在那,GET和POST工作正常。但是当我定义PUT时,我在rest客户端得到以下响应:

{
"status": false,
"errors": [],
"exception": "Method \"PUT\" not allowed."
}

view.py:

 class OrganizationViewSet(viewsets.ModelViewSet):
queryset = Organization.object.all()
serializer_class = OrganizationSerializer

def get_queryset(self):
    if not self.isUserAuthorized(self.request.user):
        return Response(str("forbidden"), status=status.HTTP_403_FORBIDDEN)

    return self.queryset

def create(self, request):
    if not self.isUserAuthorized(self,request.user):
        return Response(str("forbidden"), status=status.HTTP_403_FORBIDDEN)

    org = self.request.data['name']
    result = Organization.object.create_organization(org)
    if not result:
        return Response(str("error in creating organization"), status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(OrganizationSerializer(result).data, status=status.HTTP_201_CREATED)

def update(self):
    pass

urls.py

router = routers.DefaultRouter()
router.register(r'api/v1/organization', OrganizationViewSet )
urlpatterns = [
    # url(r'^', include(router.urls)),
]

有人可以建议我如何在这里实施更新方法,以便以下请求可以工作:

PUT localhost:8000/api/v1/organization/:id

Param in JSON(application/json) {
                                 "name = "new_name"
                                }

1 个答案:

答案 0 :(得分:0)

这就是我用update()做到的方式。至于partial_update,您需要partial=True中的 get_serializer() 。希望它能在未来帮助人们。

修改:完成ViewSet中的views.py课程并进行格式化。

class MonitorViewSet(viewsets.ModelViewSet):
    permission_classes_by_action = MyRestrictedViewPermissions
    queryset = models.Monitor.objects.all().order_by('monitor_name')
    serializer_class = serializers.MonitorSerializer
    def update(self, request, *args, **kwargs):
            instance = self.get_object()
            # serializer = self.get_serializer(data=request.data,many=isinstance(request.data, list), partial=True)
            serializer = self.get_serializer(instance, data=request.data)
            serializer.is_valid(raise_exception=True)

            if request.user.has_perm('change_monitor', instance):
                instance = serializer.save()
                self.perform_update(instance)
                headers = self.get_success_headers(serializer.validated_data)
                return Response(serializer.data, status=status.HTTP_206_PARTIAL_CONTENT, headers=headers)
            else:
                return HttpResponseForbidden('Somehow, you aren\'t authorized to update')

    def partial_update(self, request, *args, **kwargs):
        instance = self.get_object()
        #serializer = self.get_serializer(data=request.data,many=isinstance(request.data, list), partial=True)
        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)

        if request.user.has_perm('change_monitor',instance):
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_206_PARTIAL_CONTENT, headers=headers)
        else:
            return HttpResponseForbidden('Somehow, you aren\'t authorized to partial update')