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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:20:18