Как получить список всех пользователей с определенной группой разрешений в Django - PullRequest
54 голосов
/ 18 декабря 2008

Я хочу получить список всех авторизованных пользователей Django с определенной группой разрешений, примерно так:

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

Я не могу узнать, как это сделать. Как группы разрешений сохраняются в модели пользователя?

Ответы [ 9 ]

68 голосов
/ 14 июня 2009

Если вы хотите получить список пользователей по разрешению, посмотрите на этот вариант:

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()
42 голосов
/ 18 декабря 2008

Это будет самый простой

from django.contrib.auth import models

group = models.Group.objects.get(name='blogger')
users = group.user_set.all()
17 голосов
/ 18 декабря 2008

Я думаю, что для групповых разрешений разрешения сохраняются для групп, а затем у пользователей есть связанные группы. Таким образом, вы можете просто разрешить связь между группами пользователей.

например.

518$ python manage.py shell

(InteractiveConsole)
>>> from django.contrib.auth.models import User, Group
>>> User.objects.filter(groups__name='monkeys')
[<User: cms>, <User: dewey>]
10 голосов
/ 05 сентября 2013

Основываясь на ответе @ 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')
3 голосов
/ 09 июня 2016

Не забывайте, что указание кодового имени разрешения недостаточно, поскольку разные приложения могут использовать одно и то же кодовое имя. Нужно получить объект разрешения для правильного запроса пользователей:

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

1 голос
/ 22 декабря 2008

Группы «многие ко многим» с пользователями (видите, ничего необычного, только модели Django ...), поэтому ответ по cms будет правильным. Кроме того, это работает в обоих направлениях: имея группу, вы можете перечислить всех пользователей в ней, проверив атрибут user_set.

0 голосов
/ 25 мая 2017
$ 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, который я не могу редактировать)

0 голосов
/ 14 января 2016

Основываясь на ответе @ Августо, я сделал следующее с менеджером моделей и с помощью библиотеки 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()
0 голосов
/ 19 января 2009

Попробуйте это:

User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...