Python 为什么拒绝drf中超级用户的权限?

Python 为什么拒绝drf中超级用户的权限?,python,django,django-rest-framework,Python,Django,Django Rest Framework,在这里,我为视图中的普通用户设置了类似的权限,但也为超级用户应用了权限(我不希望这样) 我的超级用户不属于此查询返回qs.filter…exists(),因此我的权限被拒绝 但我不明白为什么默认情况下它没有被授予超级用户的所有权限?还是我在这里遗漏了什么 权限 class MyPermission(BasePermission): def has_permission(self, request, view): qs = myqs if request

在这里,我为视图中的普通用户设置了类似的权限,但也为超级用户应用了权限(我不希望这样)

我的超级用户不属于此查询
返回qs.filter…exists()
,因此我的权限被拒绝

但我不明白为什么默认情况下它没有被授予超级用户的所有权限?还是我在这里遗漏了什么

权限

class MyPermission(BasePermission):


    def has_permission(self, request, view):
        qs = myqs
        if request.method in ['put', 'patch']:
            return qs.filter(change=True).exists()
        elif request.method == 'post':
            return qs.filter(create=True).exists()
        elif request.method in SAFE_METHODS:
            return qs.filter(view=True).exists()
        elif request.method == 'delete':
            return qs.filter(delete=True).exists()
        else:
            return False
观点

背景

'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.IsAuthenticated',
],
我解决了这个问题,但我认为它不应该是超级用户的必要

permission_classes = [IsAdminUser | MyPermission]
但是我不明白为什么默认情况下它没有被授予超级用户的所有权限?
还是我在这里遗漏了什么?

您可以将权限类更改为以下内容:

来自rest\u framework.permissions导入BasePermission
类MyPermission(BasePermission):
def具有_权限(自我、请求、查看):
如果request.user.is_超级用户:
返回真值
qs=myqs
如果['put','patch']中的request.method:
返回qs.filter(change=True).exists()
elif request.method==“post”:
返回qs.filter(create=True).exists()
安全方法中的elif request.method:
返回qs.filter(view=True).exists()
elif request.method==“delete”:
返回qs.filter(delete=True).exists()
其他:
返回错误
<> P>您之所以这样做是因为DRF不考虑超级用户,除非您使用

编辑

我唯一能想到的是,您从一个自定义权限类继承所有权限类,该类检查用户是否为管理员。那你就不必每一个都登记了

来自rest\u framework.permissions导入BasePermission
#您可以将此类放在单独的文件中,如
#“base_permission.py”并将其导入需要的任何位置。
类SuperUserAllowAllPermission:
def具有_权限(自我、请求、查看):
如果request.user.is_超级用户:
返回真值
return super().具有权限(请求、查看)
类MyPermission(SuperUserAllowlPermission、BasePermission):
def具有_权限(自我、请求、查看):
qs=myqs
如果['put','patch']中的request.method:
返回qs.filter(change=True).exists()
elif request.method==“post”:
返回qs.filter(create=True).exists()
安全方法中的elif request.method:
返回qs.filter(view=True).exists()
elif request.method==“delete”:
返回qs.filter(delete=True).exists()
其他:
返回错误
类MyOtherPermission(SuperUserAllowlPermission、BasePermission):
def具有_权限(自我、请求、查看):
如果request.method==“get”:
返回真值
返回错误

如果我不想向超级用户授予某些权限,该怎么办?这就是这里的逻辑原因。@AbdulAzizBarkat我想将所有系统权限授予超级用户,而不使用模型权限。可能吗?我不想在每个权限类中指定
isadmin
。我想将所有系统权限授予超级用户,而不使用模型权限。可能吗?我不想在每个权限类中都指定IsAdminUser。我添加了一个建议,也许这不是您想要的,但它将提供一些简单性。
permission_classes = [IsAdminUser | MyPermission]