我目前正在使用Django开发API。
但是,我想创建一个视图,使用以下端点返回当前用户:/users/current
。
为此,我创建了一个列表视图,并将查询集过滤到发出请求的用户。这是有效的,但结果是一个列表,而不是一个对象。结合分页,结果看起来太复杂,与其他端点不一致。
我还尝试创建详细视图并过滤查询集,但DRF抱怨我没有提供pk或slug。
你有什么想法吗?
答案 0 :(得分:56)
通过这样的事情,你可能最好不要打破通用视图并自己编写视图。
@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,
...
})
希望有所帮助。
答案 1 :(得分:21)
最好的方法是使用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):
# ...
答案 2 :(得分:8)
如果由于某种原因必须使用通用视图集,则可以执行以下操作,
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
来返回单个项而不是列表。 / p>
答案 3 :(得分:7)
我使用了这样的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)
答案 4 :(得分:7)
您可以使用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。