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

Django自定义权限类has_object_permission参数缺失错误及自动调用问题

解决Django REST Framework权限类调用错误的问题

嘿,我看到你遇到的问题了——这个错误的根源在于你对DRF权限系统的使用方式理解有点偏差,咱们一步步来修正:

问题出在哪?

你在permission_classes里写了IsOwnerOrAdmin.has_object_permission(),这是直接调用了类方法,而不是传入权限类本身。当Django加载视图的时候,它会立即执行这个方法,但此时self、request这些参数都还没准备好,自然就会报参数缺失的错误。

而has_permission能正常工作,是因为你把IsOwnerOrAdmin这个类加到了权限列表里,DRF会自动实例化这个类,并在合适的时机调用它的has_permission和has_object_permission方法——根本不需要你手动指定调用哪个方法。

正确的修改方式

只需要把permission_classes里的多余内容删掉,只保留权限类本身即可:

class SchoolViewSet(viewsets.ModelViewSet):
    queryset = School.objects.all()
    serializer_class = SchoolSerializer
    # 只传入权限类,不要调用方法!
    permission_classes = [IsOwnerOrAdmin]
    ...

为什么这样就能生效?

DRF的权限系统工作流程是这样的:

  • 对于所有请求,首先会调用权限类的has_permission方法,验证用户是否有访问整个视图的权限;
  • 当处理对象级别的请求(比如获取单个学校、更新/删除学校)时,会额外调用has_object_permission方法,验证用户是否有权操作这个具体的对象。

你的IsOwnerOrAdmin类已经同时实现了这两个方法,所以只要把类加到permission_classes里,DRF就会自动按顺序调用这两个方法,完全不需要你手动指定。

额外提示

如果你想组合多个权限(比如要求用户先登录,再验证是否是所有者或管理员),可以在permission_classes里添加多个权限类,比如:

permission_classes = [IsAuthenticated, IsOwnerOrAdmin]

DRF会依次检查每个权限类,只有所有权限都通过,才会允许访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:28:45