Атрибут permissions

Атрибут permissions класса Group предоставляет доступ к набору разрешений, связанных с группой пользователей. Это поле типа ManyToManyField, которое связывает группу с моделями Permission. Через этот атрибут можно добавлять, удалять и проверять наличие разрешений у группы. Группы используются для централизованного управления правами: вместо назначения разрешений каждому пользователю отдельно, их назначают группе, а пользователей добавляют в эту группу.

Синтаксис

pythonfrom django.contrib.auth.models import Group, Permission

# Получение группы
group = Group.objects.get(name='moderators')

# Получение всех разрешений группы
permissions = group.permissions.all()

# Добавление разрешения
group.permissions.add(permission)

# Удаление разрешения
group.permissions.remove(permission)

# Очистка всех разрешений
group.permissions.clear()

# Проверка наличия разрешения
has_perm = group.permissions.filter(codename='can_edit_post').exists()

Пример

Создадим группу 'editors' и добавим ей разрешение на публикацию статей:

pythonfrom django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article

# Создаем группу
group = Group.objects.create(name='editors')

# Получаем разрешение 'can_publish_article'
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.get(
  content_type=content_type,
  codename='can_publish_article'
)

# Добавляем разрешение группе
group.permissions.add(permission)

# Проверяем результат
res = group.permissions.all()
print(res)

Результат выполнения кода:

python[<Permission: myapp | article | Can publish article>]

Пример

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

pythonfrom django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article

# Получаем группу
group = Group.objects.get(name='editors')

# Получаем разрешения
content_type = ContentType.objects.get_for_model(Article)
perm1 = Permission.objects.get(
  content_type=content_type,
  codename='can_publish_article'
)
perm2 = Permission.objects.get(
  content_type=content_type,
  codename='can_edit_article'
)

# Добавляем оба разрешения
group.permissions.add(perm1, perm2)

# Проверяем наличие разрешения
has_perm = group.permissions.filter(codename='can_publish_article').exists()
print(f"Has publish permission: {has_perm}")

# Удаляем разрешение
group.permissions.remove(perm1)

# Проверяем снова
has_perm = group.permissions.filter(codename='can_publish_article').exists()
print(f"Has publish permission after removal: {has_perm}")

Результат выполнения кода:

python"Has publish permission: True"
"Has publish permission after removal: False"

Пример

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

pythonfrom django.contrib.auth.models import Group

# Получаем группу
group = Group.objects.get(name='moderators')

# Получаем все коды разрешений
permission_codes = group.permissions.values_list('codename', flat=True)

# Выводим результат
res = list(permission_codes)
print(res)

Результат выполнения кода:

python["can_delete_comment", "can_edit_comment", "can_ban_user"]

Смотрите также

  • атрибут User.groups,
    который предоставляет доступ к группам пользователя
  • метод User.has_perm,
    который проверяет наличие разрешения у пользователя
  • метод User.has_perms,
    который проверяет наличие нескольких разрешений
  • класс Group,
    который предоставляет модель группы пользователей