Python Django超级用户没有所有权限
在尝试创建Django Rest Framework端点以显示用户权限时,我遇到了超级用户问题 我认为超级用户在默认情况下拥有所有权限,但当我试图通过权限模型获得任何用户的所有权限时,我得到了列表之间的长度差异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()返回一个字符串列表,这些字符串是权限(而不是查询集)中数
#用户是超级用户
>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')
的长度是519Permission.objects.values\u list('content\u type\u app\u label','codename').distinct()
也给出了519。那么,您的数据库中是否可能存在重复权限?理论上,绝对是这样的:这是一个拥有11年数据和8年开发时间的数据库!我以为distinct会处理它,但我怀疑这只会影响主键。快速浏览一下还可以发现,在“content_type”+“codename”上有一个唯一的集合,因此我不确定在使用这两个值的值列表时,集合应该如何不同。