You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF视图无法返回当前登录用户问题排查及解决

DRF视图仅返回当前登录用户的问题解决

问题场景

需求是让DRF视图仅返回当前登录用户的数据,但默认queryset返回了所有用户;尝试重写get_queryset方法返回self.request.user无法获取当前用户,关联用户的序列化器也未生效。

相关代码

views.py

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework import status

from rsm_app.api.v1 import serializer as serializers
from rsm_app.users.models import User


class CurrentUserView(viewsets.ModelViewSet):

    permission_classes = (IsAuthenticated,)
    serializer_class = serializers.UserSerializer
    #queryset = User.objects.filter(name=request.user.name)

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

    def put(self, request):
        serializer = serializers.UserSerializer(
            request.user, data=request.data)
        if request.data and serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response({}, status=status.HTTP_400_BAD_REQUEST)

urls.py

from rest_framework import routers
from django.urls import path, re_path, include

from graphene_django.views import GraphQLView
from rsm_app.api.v1 import views

app_name = "api.v1"
# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r"user", views.CurrentUserView, basename="user")

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path("graphql", GraphQLView.as_view(graphiql=True)),
    re_path(r"^", include(router.urls)),
    re_path(r"user/", views.CurrentUserView, name='user'),
    re_path(r"^api-auth/", include("rest_framework.urls",
            namespace="rest_framework")),
]

问题原因及解决

问题根源是会话令牌未保存,导致请求无法正确识别当前登录用户。

另外补充代码优化点:ModelViewSet的get_queryset方法要求返回QuerySet实例而非单个模型对象,原代码中return self.request.user不符合规范,正确写法应为:

def get_queryset(self):
    return User.objects.filter(pk=self.request.user.pk)

不过核心问题还是会话令牌未保存,确保请求中携带有效的、已保存的会话令牌,才能让self.request.user正确指向当前登录用户。

内容的提问来源于stack exchange,提问作者Jabba the Hutt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:35:28