2008-12-18 38 views
46

得到所有用戶的列表與特定權限組我想所有的Django auth用戶的列表與特定的權限組,這樣的事情:如何在Django

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

我查不到這個怎麼做。在用戶模型中如何保存權限組?

回答

59

,看看這個變種:

+0

我有一個基本的模型,有這個要求 - 過濾一個用戶列表的特定對象級權限(django-guardian)。什麼是最好的方式來做到這一點 - 在模型上,在ModelForm或單獨的窗體上? – 2014-08-31 12:23:22

41

這將是最簡單

from django.contrib.auth import models 

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

我覺得對組的權限,權限是對存儲組,然後用戶可以鏈接到他們組。所以你可以解決用戶組關係。

例如

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

謝謝,修復它,我知道應該很簡單。唯一的問題是,如果組名改變了,也許我應該過濾ID或其他東西... 但是,謝謝! – espenhogbakk 2008-12-18 21:19:04

1

組與用戶(你看,沒有什麼不尋常的,只是Django模型...)是多對多的,所以cms的答案是正確的。此外,這兩種方式都有效:擁有一個組,您可以通過檢查user_set屬性列出其中的所有用戶。如果你想獲得通過權限的用戶列表

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

試試這個

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

基於@ Glader的答案,這個功能包裝起來的單一的查詢,並已被修改,以算法中獲得超級用戶(通過定義,他們都燙髮):基於@Aug

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

usto的回答是,我使用模型管理器並使用authtools庫進行了以下操作。這是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() 

然後在models.py

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


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

不要忘了指定權限的代號是不夠的,因爲不同的應用程序可以重複使用相同的代號。人們需要獲得許可對象要正確查詢用戶:

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

代碼進口: 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)...'] 

(CMS,從簡單的答案,這是我不能編輯)