77

我目前正在使用 Django 开发 API。

但是,我想创建一个视图,该视图返回具有以下端点的当前用户:/users/current/

为此,我创建了一个列表视图并过滤了发出请求的用户的查询集。这行得通,但结果是一个列表,而不是单个对象。结合分页,与其他端点相比,结果看起来过于复杂和不一致。

我还尝试创建详细视图并过滤查询集,但 DRF 抱怨我没有提供 pk 或 slug。

你有什么主意吗?

4

6 回答 6

85

有了这样的东西,你可能最好打破通用视图并自己编写视图。

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

你也可以像这样使用基于类的视图来做同样的事情......

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

当然,你也不需要使用序列化器,你同样可以从用户实例中提取你需要的字段。

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

希望有帮助。

于 2013-04-03T08:35:59.700 回答
34

最好的方法是使用viewsets.ModelViewSetlike 的力量:

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.ModelViewSetmixins.CreateModelMixin+ mixins.RetrieveModelMixin+ mixins.UpdateModelMixin+ mixins.DestroyModelMixin+ mixins.ListModelMixin+的组合viewsets.GenericViewSet。如果您只需要列出所有或获取特定用户,包括当前经过身份验证的用户,您只需像这样替换它

class UserViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    # ...
于 2016-04-14T14:36:48.527 回答
11

如果出于某种原因必须使用通用视图集,则可以执行以下操作,

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当客户端使用诸如主键之类的标识符请求单个实例时/users/10调用方法将正常触发检索方法。检索自身调用get_object。如果您希望视图始终返回当前使用的视图,则可以通过在其中调用和返回来修改get_object并强制list方法返回单个项目而不是列表self.retrieve

于 2015-01-21T09:49:07.930 回答
10

您可以使用 mixins,而不是使用 ModelViewSet 的全部功能。就像这里提到的那样,有用于检索单个对象的 RetrieveModelMixin - http://www.django-rest-framework.org/api-guide/viewsets/#example_3

class UserViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_object(self):
        return self.request.user

如果您还需要更新模型,只需添加 UpdateModelMixin。

于 2015-12-01T22:14:36.400 回答
9

我使用了这样的 ModelViewSet:

class UserViewSet(viewsets.ModelViewSet):
    model = User
    serializer_class = UserSerializer

    def dispatch(self, request, *args, **kwargs):
        if kwargs.get('pk') == 'current' and request.user:
            kwargs['pk'] = request.user.pk

        return super(UserViewSet, self).dispatch(request, *args, **kwargs)
于 2013-12-13T14:44:51.567 回答
1

使用这种方式在django rest框架中获取登录用户数据

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

在 urls.py 文件中添加 api。

path('logged_in_user', LoggedInUserView.as_view())
于 2021-10-26T10:30:05.383 回答