当前位置: 首页 > 知识库问答 >
问题:

用Django Rest框架返回当前用户

马梓
2023-03-14

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

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

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

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

共有3个答案

鲁淇
2023-03-14

您可以使用mixins,而不是使用< code>ModelViewSet的全部功能。有一个< code>RetrieveModelMixin用于检索单个对象,就像这里提到的那样-http://www . django-rest-framework . org/API-guide/view sets/# example _ 3

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

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

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

杨利
2023-03-14

最好的方法是使用view set. Model ViewSet的力量,如下所示:

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().get_object()

视图集。Model ViewSet混音的组合。CreateModel Mi新混音。RetrieveModel Mi新混音。UpdateModel Mi新混音。ListModel Mi新视图集。通用视图集。如果您需要列出所有或获得特定用户,包括当前经过身份验证的用户,您只需像这样替换它

class UserViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    # ...
高宇定
2023-03-14

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

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

希望有帮助。

 类似资料:
  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 这是关于Flutter Firebase认证插件。< br >我试图在创建新用户后发送验证电子邮件,但sendEmailVerification()在内部使用currentUser()。这在我看来像是一个bug,但为了以防万一,我向stackoverflow提出了一个问题。错误在Android和IOS上是一样的。< br > 前两行返回Firebase User。第三个返回null。第四,如果第三

  • 问题内容: 民间, 我试图了解MomentJS API。在机器上获取当前时间的合适方法是什么? 与 试图解析他们的文档,并且不清楚使用什么。 http://momentjs.com/docs/#/query/is-a- moment/ 问题答案: 在这里,您要为CurrentDate分配一个momentjs实例: 这里只是一个字符串,是momentjs实例的默认格式的结果: 这里是自一月…以来的秒

  • 我遇到了这样的错误: 回溯: 文件“/usr/local/lib/python2.7/dist packages/django/core/handlers/exception.py”,位于内部41。响应=获取响应(请求) 文件“/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py”,位于_-get_-response

  • 前端框架图图形展示: 如上图所示,WeX5前端框架(UI2)分以下部分: 基础库 WeX5前端依赖的两个基础库:数据感知MVVM和jQuery,其中数据感知MVVM基于Knockoutjs改进的。 模块框架 UI2遵循AMD模块标准,采用RequireJS实现。模块化是UI2的基础,UI2的所有资源(包括js、css和html等)都是模块,都采用模块化方式引入,采用模块化方式管理依赖。 组件框架