我有一个使用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"
}
答案 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')