Return the current user with Django Rest Framework Return the current user with Django Rest Framework python python

Return the current user with Django Rest Framework


With something like this you're probably best off breaking out of the generic views and writing the view yourself.

@api_view(['GET'])def current_user(request):    serializer = UserSerializer(request.user)    return Response(serializer.data)

You could also do the same thing using a class based view like so...

class CurrentUserView(APIView):    def get(self, request):        serializer = UserSerializer(request.user)        return Response(serializer.data)

Of course, there's also no requirement that you use a serializer, you could equally well just pull out the fields you need from the user instance.

@api_view(['GET'])def current_user(request):    user = request.user    return Response({        'username': user.username,        'email': user.email,        ...    })

Hope that helps.


The best way is to use the power of viewsets.ModelViewSet like so:

class UserViewSet(viewsets.ModelViewSet):    queryset = User.objects.all()    serializer_class = UserSerializer    def get_object(self):        pk = self.kwargs.get('pk')        if pk == "current":            return self.request.user        return super(UserViewSet, self).get_object()

viewsets.ModelViewSet is a combination of mixins.CreateModelMixin + mixins.RetrieveModelMixin + mixins.UpdateModelMixin + mixins.DestroyModelMixin + mixins.ListModelMixin + viewsets.GenericViewSet. If you need just list all or get particular user including currently authenticated you need just replace it like this

class UserViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):    # ...


If you must use the generic view set for some reason, you could do something like this,

class UserViewSet(viewsets.ModelViewSet):    model = User    serializer_class = UserSerializer    def get_object(self):        return self.request.user    def list(self, request, *args, **kwargs):        return self.retrieve(request, *args, **kwargs)

retrieve method is called when the client requests a single instance using an identifier like a primary key /users/10 would trigger the retrieve method normally. Retrieve itself calls get_object. If you want the view to always return the current used then you could modify get_object and force list method to return a single item instead of a list by calling and returning self.retrieve inside it.