Method GET not allowed in DRF ViewSet when trying to retrieve single resource

2.4k views Asked by At

I am new Python and Django. I have created ViewSet as follows:

api/views.py

class UserDetails(ViewSet):
"""
CREATE, SELECT, UPDATE OR DELETE
"""

def retrive(self, request, pk):
    user = self.get_object(pk)
    print(user.query)
    user = TestSerializer(user)
    return Response(user.data)

def list(self, request):
    users = TestTB.objects.all()
    print(users.query)
    serializer = TestSerializer(users, many=True)
    return Response(serializer.data)

def create(self, request):
    serializer = TestSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def update(self, request, pk):
    user = self.get_object(pk)
    serializer = TestSerializer(user, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def destroy(self, request, pk):
    user = self.get_object(pk)
    user.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

def get_object(self, pk):
    try:
        return TestTB.objects.get(pk=pk)
    except TestTB.DoesNotExist:
        raise Http404

api/urls.py

router = routers.DefaultRouter()
router.register(r'users', UserDetails, base_name='user-details')

urlpatterns = router.urls

This works fine with POST request to create new resource, GET request to get all resources, PUT request to update resource and DELETE request to delete resource. But how can I retrieve single resource? When I make request like http://127.0.0.1:8000/api/users/1/ than it shows error -

{ "detail": "Method \"GET\" not allowed." }

It means that retrieve() method in UserDetails is never called. I know I am missing something, but not able to figure out what.

1

There are 1 answers

1
Noshii On BEST ANSWER

Change retrive to retrieve. Made an answer out of the comment, as suggested by @Linovia.