DRF - create a resource / me alias for the current user

How to create a resource that will have an endpoint / user / me url that will point to the current user and behave exactly like / user / <userid> (for example, all messages tagged, deleted requests made for / user / me should work just like / user / <userid>). I see that there is a @detail_route decorator for custom routes, but it seems that inside it I will need to duplicate the code there, for each individual request method, which does not seem to be a good option. I just need to make an alias for the current user. Im talking about ModelViewSet

+4
source share
1 answer

I have not tested this, since I myself am not using ViewSets, but I believe that you could do something like this:

In urls.py:

from django.conf.urls import url
from rest_framework import routers

from . import views


router = routers.SimpleRouter()
router.register(r'users', views.UserViewSet)

urlpatterns = [
    url(r'^users/me/$', views.UserViewSet.as_view(), kwargs={'pk': 'me'}),
    url(r'^', include(router.urls)),
]

In views.py:

from rest_framework import viewsets

from .models import User
from .serializers import UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_object(self):
        if self.kwargs.get('pk', None) == 'me':
            self.kwargs['pk'] = self.request.user.pk
        return super(UserViewSet, self).get_object()

Again, this is completely untested and completely theoretical, but something like that should work.

+2
source

All Articles