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

时间:2008-12-18 16:00:50

标签: python django dictionary permissions

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

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

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

9 个答案:

答案 0 :(得分:68)

如果您想获得许可的用户列表,请查看以下变体:

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

答案 1 :(得分:42)

这将是最简单的

from django.contrib.auth import models

group = models.Group.objects.get(name='blogger')
users = group.user_set.all()

答案 2 :(得分:17)

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

e.g。

518$ python manage.py shell

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

答案 3 :(得分: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')

答案 4 :(得分:3)

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

const int

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

试试这个:

User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))

答案 7 :(得分:0)

根据@ Augusto的回答,我使用模型管理器并使用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()

答案 8 :(得分:0)

$ 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&#39;答案,我无法编辑)