无法在Django rest framework ModelViewSet中实现PUT
我有一个使用ModelViewSet实现的模型。在这方面,GET和POST工作正常。但当我定义PUT时,我在rest客户端中得到以下响应:无法在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
{
"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
?是的,它是受支持的。