esp*_*akk 57 python django permissions dictionary
我想获得具有特定权限组的所有Django auth用户的列表,如下所示:
user_dict = {
'queryset': User.objects.filter(permisson='blogger')
}
Run Code Online (Sandbox Code Playgroud)
我无法找到如何做到这一点.如何在用户模型中保存权限组?
小智 73
如果要按权限获取用户列表,请查看以下变体:
from django.contrib.auth.models import User, Permission
from django.db.models import Q
perm = Permission.objects.get(codename='blogger')
users = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm)).distinct()
Run Code Online (Sandbox Code Playgroud)
Dan*_*aab 42
这将是最简单的
from django.contrib.auth import models
group = models.Group.objects.get(name='blogger')
users = group.user_set.all()
Run Code Online (Sandbox Code Playgroud)
cms*_*cms 19
我认为对于组权限,权限是针对组存储的,然后用户具有链接到它们的组.所以你可以解决用户 - 组关系.
例如
518$ python manage.py shell
(InteractiveConsole)
>>> from django.contrib.auth.models import User, Group
>>> User.objects.filter(groups__name='monkeys')
[<User: cms>, <User: dewey>]
Run Code Online (Sandbox Code Playgroud)
aug*_*men 10
基于@Glader的回答,这个函数将它包装在一个查询中,并且已被修改为algo获取超级用户(根据定义,它们具有所有权限):
from django.contrib.auth.models import User
from django.db.models import Q
def users_with_perm(perm_name):
return User.objects.filter(
Q(is_superuser=True) |
Q(user_permissions__codename=perm_name) |
Q(groups__permissions__codename=perm_name)).distinct()
# Example:
queryset = users_with_perm('blogger')
Run Code Online (Sandbox Code Playgroud)
不要忘记指定权限代号是不够的,因为不同的应用程序可能会重复使用相同的代号。需要获取权限对象才能正确查询用户:
def get_permission_object(permission_str):
app_label, codename = permission_str.split('.')
return Permission.objects.filter(content_type__app_label=app_label, codename=codename).first()
def get_users_with_permission(permission_str, include_su=True):
permission_obj = get_permission_object(permission_str)
q = Q(groups__permissions=permission_obj) | Q(user_permissions=permission_obj)
if include_su:
q |= Q(is_superuser=True)
return User.objects.filter(q).distinct()
Run Code Online (Sandbox Code Playgroud)
带导入的代码:https : //github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/models.py