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

