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?
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()
Dies wäre am einfachsten
from Django.contrib.auth import models
group = models.Group.objects.get(name='blogger')
users = group.user_set.all()
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>]
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')
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
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.
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()
Versuche dies:
User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))
$ 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)