2

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.

14
  • 2
    Change 'retrive' to 'retrieve', seems like a typo to me Commented Sep 12, 2017 at 7:29
  • 3
    Add serializer and queryset and remove all methods when u don't need override them :) Commented Sep 12, 2017 at 7:32
  • @Noshii Great! It was silly typo error. But than print(user.query) is throwing error. Is there any other way to view which query is getting fired? Commented Sep 12, 2017 at 7:33
  • 1
    user is not a queryset. Commented Sep 12, 2017 at 7:34
  • 1
    You can also install Django Debug Toolbar. Ref: Using django.db.connection Commented Sep 12, 2017 at 7:37

1 Answer 1

5

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

Sign up to request clarification or add additional context in comments.

1 Comment

I don't really see a reason it wouldn't work passed this typo which prevents the binding of the detail GET verb with a concrete action.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.