Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Django rest framework ModelViewSet中实现PUT_Django_Django Models_Django Views_Django Rest Framework - Fatal编程技术网

无法在Django rest framework ModelViewSet中实现PUT

无法在Django rest framework ModelViewSet中实现PUT,django,django-models,django-views,django-rest-framework,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() seri

我有一个使用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
url.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"
                                }

这就是我使用
update()
所做的。至于
partial\u update
,您需要在
get\u serializer()
中找到
partial=True
。希望它能帮助未来的人们

Edit:在
views.py
中完成我的
ViewSet
类并设置格式

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')

如果要更新,可以使用
PATCH
方法,而不是
PUT
。视图集中是否支持路径?您的意思是
PATCH
?是的,它是受支持的。