如何在Django REST Framework的ModelViewSet的list方法中获取认证信息
解决方法
在DRF的视图方法里,**request.user**就是当前通过认证的用户对象,前提是你已经在项目中配置了正确的认证方式(比如Session认证、Token认证等)。
方法一:直接重写list方法过滤数据
修改你现有的list方法,把查询集过滤为当前用户的记录即可:
class DrawingViewSet(viewsets.ModelViewSet): queryset = m.Drawing.objects.all() serializer_class = s.DrawingSerializer filterset_fields = ['user'] def list(self, request): # 只获取当前认证用户的Drawing数据 queryset = m.Drawing.objects.filter(user=request.user) serializer = s.DrawingSerializer(queryset, many=True) return Response(serializer.data)
方法二:重写get_queryset(更推荐)
这种方式更符合DRF的设计规范,因为get_queryset会被所有数据查询相关的动作(list、retrieve等)调用,能统一限制用户只能访问自己的数据:
class DrawingViewSet(viewsets.ModelViewSet): serializer_class = s.DrawingSerializer filterset_fields = ['user'] def get_queryset(self): # 过滤出当前用户的所有Drawing记录 return m.Drawing.objects.filter(user=self.request.user)
这里不需要再定义queryset = m.Drawing.objects.all(),因为get_queryset会动态返回过滤后的数据集。
注意事项
- 确保项目已配置认证类,比如在
settings.py中添加:REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ], # 可选:设置默认权限类,拦截未认证用户的访问 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] } - 如果遇到未认证的用户,
request.user会是匿名用户对象,可根据需求处理,比如返回空数据集:def get_queryset(self): if not self.request.user.is_authenticated: return m.Drawing.objects.none() return m.Drawing.objects.filter(user=self.request.user)
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

