Как получить список всех пользователей с определенной группой разрешений в Django
Я хочу получить список всех пользователей Django auth с определенной группой разрешений, примерно так:
user_dict = {
'queryset': User.objects.filter(permisson='blogger')
}
Я не могу узнать, как это сделать. Как группы разрешений сохраняются в пользовательской модели?
Ответы
Ответ 1
Если вы хотите получить список пользователей по разрешению, посмотрите на этот вариант:
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()
Ответ 2
Это будет самый простой
from django.contrib.auth import models
group = models.Group.objects.get(name='blogger')
users = group.user_set.all()
Ответ 3
Я думаю, что для групповых разрешений разрешения хранятся в группах, а затем у пользователей есть группы, связанные с ними. Таким образом, вы можете просто разрешить отношение пользовательских групп.
например.
518$ python manage.py shell
(InteractiveConsole)
>>> from django.contrib.auth.models import User, Group
>>> User.objects.filter(groups__name='monkeys')
[<User: cms>, <User: dewey>]
Ответ 4
Основываясь на ответе @Glader, эта функция обертывает его в одном запросе и была изменена, чтобы algo получил суперпользователей (поскольку по определению у них есть все perms):
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')
Ответ 5
Не забывайте, что указание кодового имени разрешено недостаточно, потому что разные приложения могут повторно использовать одно и то же имя. Нужно получить объект разрешения для правильного запроса пользователей:
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
Ответ 6
Группы - это многие ко многим с пользователями (вы видите, ничего необычного, просто модели Django...), поэтому ответ на cms прав. Плюс это работает в обоих направлениях: имея группу, вы можете перечислить всех пользователей в ней, проверив атрибут user_set
.
Ответ 7
Попробуйте следующее:
User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))
Ответ 8
Основываясь на ответе @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()
Ответ 9
$ 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, который я не могу редактировать)