Django 超级用户没有所有权限

Django superuser not having all permissions

在尝试创建用于显示用户权限的 Django Rest Framework 端点时,我遇到了有关超级用户的问题。

我原以为超级用户默认拥有所有权限,但当我尝试通过权限模型获取任何用户的所有权限时,我发现列表之间存在长度差异。

# User is a superuser
> len(user.get_all_permissions())
516
> len(Permission.objects.all().distinct())
519

由于 get_all_permissions() returns 是一个字符串列表,这些字符串是来自权限而不是 QuerySet 的数据的一些排列,我无法确切地看到超级用户缺少哪些权限。

我认为超级用户拥有所有权限的印象是错误的吗?是否有其他方法以权限查询集的形式获取用户的所有权限? 我总是可以 return user.get_all_permissions() 给出的列表而不是 QuerySet,但是当涉及到可能的响应格式时,这会使 DRF-Swagger 感到困惑。

Since get_all_permissions() returns a list instead of a QuerySet, I am unable to see exactly which permissions the superuser lacks.

怎么会这样?像

all_permission_ids = {
  f'{app_label}.{codename}'
  for (app_label, codename)
  in Permission.objects.values_list('content_type__app_label', 'codename')
}
missing_permissions = (
  all_permission_ids - 
  set(user.get_all_permissions())
)

应该让你继续。

Am I wrong in my impression that a superuser has all permissions?

不,你不是。超级用户确实拥有所有权限,一般是short-circuited,即你只检查用户是否是超级用户,如果是,则不应再进行权限检查。

Are there other ways to get all permissions for a user in the form of a Permission QuerySet?

有点。像

user_permissions_qs = Permission.objects.filter(id__in={p.id for p in user.get_all_permissions()})

可以工作,但确实不是最佳选择 performance-wise。