it-swarm.com.de

So erhalten Sie eine Liste aller Benutzer mit einer bestimmten Berechtigungsgruppe in Django

Ich möchte eine Liste aller Django-Auth-Benutzer mit einer bestimmten Berechtigungsgruppe erhalten.

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

Ich kann nicht herausfinden, wie das geht. Wie werden die Berechtigungsgruppen im Benutzermodell gespeichert?

52
espenhogbakk

Wenn Sie eine Liste der Benutzer mit Erlaubnis erhalten möchten, sehen Sie sich diese Variante an:

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

Dies wäre am einfachsten 

from Django.contrib.auth import models

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

Ich denke, für Gruppenberechtigungen werden Berechtigungen für Gruppen gespeichert, und dann sind Benutzer mit Gruppen verknüpft. Sie können also nur die Benutzer - Gruppen - Beziehung auflösen.

z.B. 

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

Basierend auf der Antwort von @ Glader fasst diese Funktion sie in einer einzigen Abfrage zusammen und wurde dahingehend modifiziert, dass sie die Superuser auch erhält (per Definition haben sie alle 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')
10
Augusto Men

Vergessen Sie nicht, dass die Angabe von Erlaubnis-Codenamen nicht ausreicht, da verschiedene Apps denselben Codenamen wiederverwenden können. Man muss ein Berechtigungsobjekt erhalten, um Benutzer korrekt abzufragen:

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 beim Importieren: https://github.com/Dmitri-Sintsov/Django-jinja-knockout/blob/master/Django_jinja_knockout/models.py

3
Dmitriy Sintsov

Gruppen sind viele-zu-viele mit Benutzern (Sie sehen, nichts Ungewöhnliches, nur Django-Modelle ...), daher ist die Antwort nach cms richtig. Außerdem funktioniert dies in beide Richtungen: Mit einer Gruppe können Sie alle Benutzer darin auflisten, indem Sie das user_set-Attribut überprüfen.

1
zgoda

Basierend auf der Antwort von @ Augusto habe ich Folgendes mit einem Modellmanager und der Verwendung der authtools-Bibliothek ausgeführt. Dies ist in 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()

Und dann in models.py:

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


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

Versuche dies:

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

(vereinfacht aus der Antwort von cms, die ich nicht bearbeiten kann)

0
Jan Kyu Peblik