如何进行 Django REST 框架 /me/ 调用?

awi*_*ery 4 django django-rest-framework

假设我有一个ViewSet

class ProfileViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows a user's profile to be viewed or edited.
    """
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

...和一个HyperlinkedModelSerializer

class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Profile
        read_only_fields = ('user',)
Run Code Online (Sandbox Code Playgroud)

我的urls.py设置如下:

router.register(r'profiles', api.ProfileViewSet, base_name='profile')
Run Code Online (Sandbox Code Playgroud)

这让我可以访问,例如/api/profile/1/很好。

我想在我的 API 上设置一个新端点(类似于 Facebook API 的/me/调用)/api/profile/me/以访问当前用户的个人资料 - 如何使用 Django REST Framework 执行此操作?

dan*_*ast 5

使用@Gerard 的解决方案给我带来了麻烦:

Expected view UserViewSet to be called with a URL keyword argument named "pk". Fix your URL conf, or set the .lookup_field attribute on the view correctly..
Run Code Online (Sandbox Code Playgroud)

看一下retrieve()源代码似乎user_id没有使用(未使用*args

此解决方案有效:

from django.contrib.auth import get_user_model
from django.shortcuts import get_object_or_404

from rest_framework import filters
from rest_framework import viewsets
from rest_framework import mixins
from rest_framework.decorators import list_route
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from ..serializers import UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    A viewset for viewing and editing user instances.
    """
    serializer_class = UserSerializer
    User = get_user_model()
    queryset = User.objects.all()
    filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter)
    filter_fields = ('username', 'email', 'usertype')
    search_fields = ('username', 'email', 'usertype')

    @list_route(permission_classes=[IsAuthenticated])
    def me(self, request, *args, **kwargs):
        User = get_user_model()
        self.object = get_object_or_404(User, pk=request.user.id)
        serializer = self.get_serializer(self.object)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

访问/api/users/me具有相同数据的回复/api/users/1(当登录用户是 user 时pk=1


Ger*_*ard 4

您可以使用装饰器在视图类中创建一个新方法list_route,例如:

class ProfileViewSet(viewsets.ModelViewSet):

    @list_route()
    def me(self, request, *args, **kwargs):
        # assumes the user is authenticated, handle this according your needs
        user_id = request.user.id
        return self.retrieve(request, user_id)
Run Code Online (Sandbox Code Playgroud)

请参阅有关此的文档以获取更多信息@list_route

我希望这有帮助!