DRF - 为当前用户创建资源别名/我

Ald*_*und 8 python django django-rest-framework

如何创建一个资源,其中/ user/me url端点将指向当前用户并且行为与/ user/<userid>完全相同(例如,对/ user/me执行的所有post,put,delete请求应该以相同的方式工作as/user/<userid>).我看到有一个@detail_route装饰器用于自定义路由,但似乎在其中我将需要在那里复制代码,对于每个单独的请求方法,这似乎不是一个好的选择.我只需要为当前用户创建一个别名.我在谈论ModelViewSet

Joe*_*elm 7

我还没有测试过,因为我自己没有使用ViewSets,但是我相信您可以执行以下操作:

在您的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)),
]
Run Code Online (Sandbox Code Playgroud)

在您的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()
Run Code Online (Sandbox Code Playgroud)

同样,这完全未经测试,也完全是理论上的,但是这种方法应该可以工作。