web-dev-qa-db-fra.com

Comment obtenir une liste de tous les utilisateurs avec un groupe d'autorisations spécifique dans Django

Je veux obtenir une liste de tous les utilisateurs Django avec un groupe d'autorisations spécifique, quelque chose comme ceci:

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

Je ne peux pas savoir comment faire cela. Comment les groupes d'autorisations sont-ils enregistrés dans le modèle utilisateur?

52
espenhogbakk

Si vous souhaitez obtenir la liste des utilisateurs avec autorisation, regardez cette 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()
67
Glader

Ce serait le plus facile 

from Django.contrib.auth import models

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

Je pense que pour les autorisations de groupe, les autorisations sont stockées contre des groupes, puis les utilisateurs sont liés à des groupes. Vous pouvez donc simplement résoudre la relation utilisateur-groupe.

par exemple. 

518$ python manage.py Shell

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

Sur la base de la réponse de @ Glader, cette fonction la résume en une seule requête et a été modifiée pour obtenir les superutilisateurs (comme par définition, ils ont tous les permanents):

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')
10
Augusto Men

N'oubliez pas que spécifier le nom de code de permission n'est pas suffisant car différentes applications peuvent réutiliser le même nom de code. Il faut obtenir l’objet permission pour interroger correctement les utilisateurs:

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

Code avec importations: https://github.com/Dmitri-Sintsov/Django-jinja-knockout/blob/master/Django_jinja_knockout/models.py

3
Dmitriy Sintsov

Les groupes d'utilisateurs sont nombreux (vous voyez, rien d'inhabituel, juste des modèles Django ...), donc la réponse par cms est correcte. De plus, cela fonctionne dans les deux sens: en ayant un groupe, vous pouvez lister tous les utilisateurs en inspectant l'attribut user_set.

1
zgoda

Sur la base de la réponse de @ Augusto, j'ai effectué les opérations suivantes avec un gestionnaire de modèles et en utilisant la bibliothèque authtools. C'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()

Et puis dans models.py:

from Django.db import models
from authtools.models import AbstractEmailUser
from .querysets import UserManager


class User(AbstractEmailUser):
   objects = UserManager()
0
raiderrobert

Essaye ça:

User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))
0
Ankhbayar
$ 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)...']

(simplifié à partir de la réponse de cms, que je ne peux pas éditer)

0
Jan Kyu Peblik