如何获得在Django中具有特定权限组的所有用户的列表

我想获得一个具有特定权限组的所有Django auth用户的列表,如下所示:

user_dict = { 'queryset': User.objects.filter(permisson='blogger') } 

我无法find如何做到这一点。 在用户模型中如何保存权限组?

如果你想获得许可的用户列表,看看这个变种:

 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() 

这将是最简单的

 from django.contrib.auth import models group = models.Group.objects.get(name='blogger') users = group.user_set.all() 

我认为对于组权限,权限是针对组存储的,然后用户将组链接到它们。 所以你可以解决用户组关系。

例如

 518$ python manage.py shell (InteractiveConsole) >>> from django.contrib.auth.models import User, Group >>> User.objects.filter(groups__name='monkeys') [<User: cms>, <User: dewey>] 

根据@Glader的回答,这个函数把它包装在一个单一的查询中,并且已经被修改为使得超级用户(按照定义,它们具有所有的权限):

 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') 

组与用户是多对多的(你看,没有什么不寻常的,只是Django模型…),所以cms的答案是正确的。 此外,这两种方式的工作:有一个组,你可以通过检查user_set属性列出其中的所有用户。

不要忘记指定权限代码名是不够的,因为不同的应用程序可能会重复使用相同的代号。 需要获取权限对象才能正确查询用户:

 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() 

使用导入代码: https : //github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/models.py

根据@ Augusto的回答,我使用模型pipe理器并使用了authtools库。 这在querysets.py

 from django.db.models import Q from authtools.models import UserManager as AuthUserManager class UserManager(AuthUserManager): def get_users_with_perm(self, perm_name): return self.filter( Q(user_permissions__codename=perm_name) | Q(groups__permissions__codename=perm_name)).distinct() 

然后在models.py

 from django.db import models from authtools.models import AbstractEmailUser from .querysets import UserManager class User(AbstractEmailUser): objects = UserManager() 

尝试这个:

 User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger')) 
 $ python manage.py shell <<'EOF' > from django.contrib.auth.models import User > User.objects.filter(groups__name='blogger') > EOF ... (InteractiveConsole) >>> >>> [<User: foo>, <User: bar>, <User: baz>, '...(remaining elements truncated)...'] 

(从cms的答案简化,我不能编辑)