Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django超级用户没有所有权限_Python_Django_Django Rest Framework_Swagger Ui - Fatal编程技术网

Python Django超级用户没有所有权限

Python Django超级用户没有所有权限,python,django,django-rest-framework,swagger-ui,Python,Django,Django Rest Framework,Swagger Ui,在尝试创建Django Rest Framework端点以显示用户权限时,我遇到了超级用户问题 我认为超级用户在默认情况下拥有所有权限,但当我试图通过权限模型获得任何用户的所有权限时,我得到了列表之间的长度差异 #用户是超级用户 >len(user.get_all_permissions()) 516 >len(Permission.objects.all().distinct()) 519 由于get_all_permissions()返回一个字符串列表,这些字符串是权限(而不是查询集)中数

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

我认为超级用户在默认情况下拥有所有权限,但当我试图通过权限模型获得任何用户的所有权限时,我得到了列表之间的长度差异

#用户是超级用户
>len(user.get_all_permissions())
516
>len(Permission.objects.all().distinct())
519
由于get_all_permissions()返回一个字符串列表,这些字符串是权限(而不是查询集)中数据的某种排列,因此我无法确切地看到超级用户缺少哪些权限

我认为超级用户拥有所有权限,这是错误的吗?是否有其他方法以权限查询集的形式获取用户的所有权限? 我总是可以返回user.get_all_permissions()提供的列表,而不是QuerySet,但这会让DRF在可能的响应格式上大摇大摆

由于get_all_permissions()返回一个列表而不是查询集,因此我无法确切地看到超级用户缺少哪些权限

怎么会这样?差不多

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())
)
user_permissions_qs = Permission.objects.filter(id__in={p.id for p in user.get_all_permissions()})
你应该走了

我认为超级用户拥有所有权限,这是错误的吗

不,你不是。超级用户确实拥有所有权限,这通常是短路的,即您只需检查该用户是否为超级用户,如果是,则不应再进行权限检查

是否有其他方法以权限查询集的形式获取用户的所有权限

有点。差不多

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())
)
user_permissions_qs = Permission.objects.filter(id__in={p.id for p in user.get_all_permissions()})

可以工作,但在性能方面确实不是最佳的。

谢谢您的回复
missing_permissions=set(Permission.objects.all())-set(user.get_all_permissions())
返回所有权限,因为集合不相似。
Permission.objects.all()
的数据类型与
user.get_all_permissions()
中的数据类型不同,后者返回一个字符串列表,字符串的“content_type.codename”,而权限的表示形式以“|”分隔
p.id
不是一个东西,因为它``get\u all\u permissions()只返回字符串列表。啊,对了,
get\u all\u permissions()
返回字符串,让我来修复它。谢谢!有一点我仍然感到困惑:为什么
所有权限\u id
-字典的长度是516,而
权限.objects.values\u list('content\u type\u app\u label','code name')
的长度是519
Permission.objects.values\u list('content\u type\u app\u label','codename').distinct()
也给出了519。那么,您的数据库中是否可能存在重复权限?理论上,绝对是这样的:这是一个拥有11年数据和8年开发时间的数据库!我以为distinct会处理它,但我怀疑这只会影响主键。快速浏览一下还可以发现,在“content_type”+“codename”上有一个唯一的集合,因此我不确定在使用这两个值的值列表时,集合应该如何不同。