用Django Rest Framework返回当前用户

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

但是 ,我想创build一个视图,返回当前用户与以下端点: /users/current

为此,我创build了一个列表视图,并将查询集过滤到发出请求的用户。 这有效,但结果是一个列表,而不是一个单一的对象。 结合分页,结果看起来太复杂,与其他端点不一致。

我也尝试创build一个详细信息视图和过滤查询集,但DRF抱怨说我没有提供PK或slu </s>。

你有什么主意吗 ?

有了这样的事情,你可能是最好的摆脱了通用的观点,并自己写视图。

 @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, ... }) 

希望有所帮助。

最好的方法是如果使用viewsets.ModelViewSet这样的function:

 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 。 如果你只需要列出所有的或者获得特定的用户,包括目前的身份validation,你只需要像这样replace它

 class UserViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): # ... 

我用这样的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) 

如果因为某种原因必须使用通用视图集,可以这样做,

 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) 

当客户端使用主键/users/10等标识符来请求单个实例时,将调用检索方法将正常触发检索方法。 检索自己的调用get_object 。 如果你想让视图总是返回当前使用的那么你可以修改get_object和强制list方法返回一个单一的项目,而不是一个列表通过调用和返回self.retrieve它里面。

而不是使用ModelViewSet的全部function,你可以使用mixin。 有RetrieveModelMixin用来检索单个对象就像这里提到的 – http://www.django-rest-framework.org/api-guide/viewsets/#example_3

 class UserViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): queryset = User.objects.all() serializer_class = UserSerializer def get_object(self): return self.request.user 

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