python django dictionary permissions

python - Cómo obtener una lista de todos los usuarios con un grupo de permisos específico en Django



dictionary permissions (9)

Quiero obtener una lista de todos los usuarios de autenticación de Django con un grupo de permisos específico, algo como esto:

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

No puedo averiguar cómo hacer esto. ¿Cómo se guardan los grupos de permisos en el modelo de usuario?


Basado en la respuesta de @ Glader, esta función lo resume en una sola consulta, y ha sido modificado para obtener algo de los superusuarios (como por definición, tienen todas las permanentes):

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


Creo que para los permisos de grupo, los permisos se almacenan en grupos, y luego los usuarios tienen grupos vinculados a ellos. Entonces puedes resolver la relación usuario - grupo.

p.ej

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


En base a la respuesta de @Augusto, hice lo siguiente con un administrador modelo y el uso de la biblioteca de herramientas de autenticación. Esto está en 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()

Y luego en models.py :

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


Este sería el más fácil

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


Los grupos son muchos con muchos usuarios (ya ves, nada inusual, solo modelos Django ...), por lo que la respuesta por cms es correcta. Además, esto funciona en ambos sentidos: al tener un grupo, puede enumerar todos los usuarios en él inspeccionando el atributo user_set .


No olvide que especificar el nombre de código de permiso no es suficiente porque diferentes aplicaciones pueden reutilizar el mismo nombre clave. Uno necesita obtener el objeto de permiso para consultar correctamente a los usuarios:

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

Código con importaciones: https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/models.py


Prueba esto:

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


Si desea obtener una lista de usuarios con permiso, mire esta variante:

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


$ 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)...'']

(simplificado de la respuesta de cms, que no puedo editar)