簡體   English   中英

如何在Django中獲取具有特定權限組的所有用戶的列表

[英]How to get a list of all users with a specific permission group in Django

我想獲得具有特定權限組的所有Django auth用戶的列表,如下所示:

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

我無法找到如何做到這一點。 如何在用戶模型中保存權限組?

如果要按權限獲取用戶列表,請查看以下變體:

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

這將是最簡單的

from django.contrib.auth import models

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

我認為對於組權限,權限是針對組存儲的,然后用戶具有鏈接到它們的組。 所以你可以解決用戶 - 組關系。

例如

518$ python manage.py shell

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

基於@Glader的回答,這個函數將它包裝在一個查詢中,並且已被修改為algo獲取超級用戶(根據定義,它們具有所有權限):

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

不要忘記指定權限代號是不夠的,因為不同的應用程序可能會重復使用相同的代號。 需要獲取權限對象才能正確查詢用戶:

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

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

根據@ Augusto的回答,我使用模型管理器並使用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()
$ 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的回答簡化,我無法編輯)

試試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM