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

Django(DRF):如何为类视图配置仅Manager组可访问的权限?

问题原因分析

你当前使用的DjangoModelPermissions是基于模型内置权限(如view_user)做校验的,但你的核心需求是仅允许Manager组用户访问接口,这种权限类无法精准匹配你的场景。另外,你在类定义阶段直接初始化queryset的写法会导致数据库查询在项目启动时就执行,而非请求时动态获取,这也不符合REST框架的最佳实践。

解决方案

推荐两种简洁的实现方式,都能精准实现你的权限控制需求:

方式一:自定义权限类(推荐)

先定义一个仅放行Manager组用户的权限类,再在视图中引用:

from rest_framework import permissions
from django.contrib.auth.models import Group

class IsManager(permissions.BasePermission):
    def has_permission(self, request, view):
        # 验证用户已登录且属于Manager组
        return request.user.is_authenticated and request.user.groups.filter(name='Manager').exists()

class ViewManager(generics.ListAPIView):
    permission_classes = [IsManager]
    serializer_class = ManagerSerializer

    def get_queryset(self):
        # 动态获取Manager组下的用户,避免项目启动时提前查询
        group = Group.objects.get(name='Manager')
        return group.user_set.all()

方式二:使用UserPassesTestMixin

如果不想自定义权限类,可结合Django的UserPassesTestMixin实现:

from django.contrib.auth.mixins import UserPassesTestMixin
from django.contrib.auth.models import Group

class ViewManager(UserPassesTestMixin, generics.ListAPIView):
    serializer_class = ManagerSerializer

    def test_func(self):
        # 校验用户是否属于Manager组
        return self.request.user.groups.filter(name='Manager').exists()

    def get_queryset(self):
        group = Group.objects.get(name='Manager')
        return group.user_set.all()
关键修改说明
  • 替换DjangoModelPermissions为组校验逻辑,直接匹配你的"仅Manager组可访问"需求,员工或匿名用户访问会直接返回403
  • 将queryset的获取移至get_queryset方法,确保每次请求时才执行数据库查询,避免项目启动阶段的无效查询

内容的提问来源于stack exchange,提问作者miron123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:43:13