我想要检索用户的所有权限,并将其作为权限ID列表返回,但是:
user.get_all_permissions()
请给我权限名称列表。如何操作?
我想要检索用户的所有权限,并将其作为权限ID列表返回,但是:
user.get_all_permissions()
请给我权限名称列表。如何操作?
获取特定用户的全部权限,以及该用户所属组中关联的权限:
from django.contrib.auth.models import Permission
def get_user_permissions(user):
if user.is_superuser:
return Permission.objects.all()
return user.user_permissions.all() | Permission.objects.filter(group__user=user)
list(set(chain(user.user_permissions.filter(content_type=ctype).values_list('codename', flat=True), Permission.objects.filter(group__user=user, content_type=ctype).values_list('codename', flat=True))))
。怀疑链式调用相比使用 | 符号有时更有效率。values_list 和按 content type 进行过滤是不必要的,但可以根据您的需求考虑其他选项。 - Chrisreturn Permission.objects.filter(Q(group__in=user.groups.all())|Q(user=user)).distinct()
也会去重。 - Paulo Scardineuser.has_perm("...")
总是返回 True
,但用户实际上可能没有与数据库中的任何 django.contrib.auth.models.Permission
记录相关联。此外,撤销超级用户状态不会从用户记录中删除权限关系。 - Evan Byrne关键是获取权限对象的方式如下:
from django.contrib.auth.models import Permission
permissions = Permission.objects.filter(user=user)
你可以通过以下方式访问 id
属性:
permissions[0].id
如果您想要列表 (id,permission_name)
,请执行以下操作:
perm_tuple = [(x.id, x.name) for x in Permission.objects.filter(user=user)]
希望它有所帮助!
user.get_user_permissions()
可以得到所有权限的代号。perm_list = user_obj.user_permissions.all().values_list('codename', flat=True)
尝试这个...
user.get_all_permissions()
返回的Permission对象的常规方法,可以通过单个查询实现。from functools import reduce
from operator import or_
from django.db.models import Q
from django.contrib.auth.models import Permission
def get_user_permission_objects(user):
user_permission_strings = user.get_all_permissions()
if len(user_permission_strings) > 0:
perm_comps = [perm_string.split('.', 1) for perm_string in user_permission_strings]
q_query = reduce(
or_,
[Q(content_type__app_label=app_label) & Q(codename=codename) for app_label, codename in perm_comps]
)
return Permission.objects.filter(q_query)
else:
return Permission.objects.none()
另外,可以直接查询权限:
from django.db.models import Q
from django.contrib.auth.models import Permission
def get_user_permission_objects(user):
if user.is_superuser:
return Permission.objects.all()
else:
return Permission.objects.filter(Q(user=user) | Q(group__user=user)).distinct()
from django.contrib.auth.models import Permission
permissions = Permission.objects.filter(user=user)
permissions[0].id
user_permissions_list = request.user.get_all_permissions()
返回用户对象 user_obj 所属组的权限字符串集合。如果 is_anonymous 或 is_active 为 False,则返回一个空集合。
request.user.get_group_permissions()
request.user.get_user_permissions()
user_permissions_list = list(Permission.objects.filter(Q(user=request.user) | Q(group__user=request.user)).values_list('codename', flat=True))
文档
扩展并解释@Shihabudheen K M的答案
我们可以直接从用户对象的查询集中获取用户权限,如下所示
perm_queryset = user_obj.user_permissions.all().values_list('id')
在这种情况下获得的查询集的格式如下:
<QuerySet [(31,), (16,), (11,), (35,), (18,), (36,)]>
用户权限的扁平化查询集:
flattened_perm_queryset = user_obj.user_permissions.all().values_list('id', flat=True)
输出:
<QuerySet [31, 16, 11, 35, 18, 36]>
要获取用户权限的 ID 列表,您可以执行以下操作:
perm_list = list(user_obj.user_permissions.all().values_list('id', flat=True))
输出:
[31, 16, 11, 35, 18, 36]
希望这对你有所帮助!