用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.ModelViewSet
是mixins.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。