我目前正在深化发展使用Django的API。
不过 ,我想创建一个具有以下端点返回当前用户视图: /users/current
。
要做到这一点,我创建了一个列表视图和过滤的queryset向提出请求的用户。 这工作,但结果是一个列表,而不是一个单一的对象。 结合到分页,结果看起来太复杂和不一致的与其他端点。
我还试图创建一个详细视图和过滤查询集但DRF抱怨说我没有提供PK或蛞蝓。
你有什么主意吗 ?
我目前正在深化发展使用Django的API。
不过 ,我想创建一个具有以下端点返回当前用户视图: /users/current
。
要做到这一点,我创建了一个列表视图和过滤的queryset向提出请求的用户。 这工作,但结果是一个列表,而不是一个单一的对象。 结合到分页,结果看起来太复杂和不一致的与其他端点。
我还试图创建一个详细视图和过滤查询集但DRF抱怨说我没有提供PK或蛞蝓。
你有什么主意吗 ?
像这样的东西你可能最好关闭爆发的一般看法和自己写的看法。
@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
像这样:
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
。 如果你只需要列出所有或获得包括特定的用户目前已验证你只需要更换它像这样
class UserViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
# ...
如果必须使用通用视图组出于某种原因,你可以做这样的事情,
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
里面。
我用了一个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)
而不是使用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。