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.