0

I have a model which is implemented using ModelViewSet. In that, GET and POST is working fine. But as I define PUT, I get following response in rest client:

{
"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)),
]

Can some one suggest how should I implement the update method here so that following request can work :

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

Param in JSON(application/json) {
                                 "name = "new_name"
                                }
Richa Gupta
  • 113
  • 2
  • 8

1 Answers1

0

This is how I did it with update(). As for partial_update, you'll need partial=True in the get_serializer(). Hope it helps people in the future.

Edit: Completing my ViewSet class in views.py and formatting.

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')
8-Bit Borges
  • 8,099
  • 15
  • 64
  • 132