2008-12-18 27 views

Odpowiedz

59

Jeśli chcesz listę użytkowników za zgodą dostać, spójrz na tego wariantu:

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

Mam podstawowy model, który ma to wymaganie - filtruj listę użytkowników na pewnym poziomie uprawnień na poziomie obiektu (django-guardian). Jaki jest najlepszy sposób, aby to zrobić - na modelu, na ModelForm lub osobnym formularzu? –

+0

Myślę, że to zapytanie wymaga '| Q (is_superuser = True) ';) – marcelm

41

To byłoby najprostszym

from django.contrib.auth import models 

group = models.Group.objects.get(name='blogger') 
users = group.user_set.all() 
16

myślę o uprawnieniach grupy, uprawnienia są zapisywane na grupy, a następnie użytkownicy mają grupy powiązanych z nimi. Więc możesz po prostu rozwiązać relacje między użytkownikami a grupami.

np.

518$ python manage.py shell 

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

Dzięki, to naprawiło, wiedziałem, że powinno być proste. Jedyny problem polega na tym, że jeśli nazwa grupy zostanie zmieniona, może powinienem odfiltrować ją na ID lub coś w zamian ... Ale dzięki! – espenhogbakk

1

Grupy są wiele-do-wielu z użytkowników (widać, nic niezwykłego, po prostu Django modeli ...), więc odpowiedź przez CMS ma rację. Dodatkowo działa to w obie strony: mając grupę, możesz wyświetlić listę wszystkich użytkowników, sprawdzając atrybut user_set.

0

Spróbuj tego:

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

podstawie @ odpowiedź Glader, ten funkcja owija go w sposób pojedyncza kwerenda i została zmodyfikowana, aby uzyskać superużytkowników (zgodnie z definicją, mają wszystkie zezwolenia):

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

Na podstawie @Aug Odpowiedź usto, zrobiłem następujące z menedżerem modelu i przy użyciu biblioteki authtools. Jest to 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() 

A potem w models.py:

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


class User(AbstractEmailUser): 
    objects = UserManager() 
2

nie należy zapominać, że określenie uprawnień kryptonim nie jest wystarczające, ponieważ różne aplikacje mogą używać tego samego kryptonimu. Trzeba uzyskać obiekt uprawnień do kwerendy Użytkownicy poprawnie:

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

kod z importu: https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/models.py

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

(uproszczony z odpowiedzią CMS', co nie mogę Edit)