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
相关产品推荐
相关产品推荐

