64

特定の権限グループを持つすべてのDjango認証ユーザーのリストを取得したいのですが、次のようになります。

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

これを行う方法がわかりません。権限グループはユーザーモデルにどのように保存されますか?

4

9 に答える 9

94

許可によってユーザーのリストを取得したい場合は、次のバリアントを見てください。

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()
于 2009-06-14T07:02:33.027 に答える
46

これが一番楽でしょう

from django.contrib.auth import models

group = models.Group.objects.get(name='blogger')
users = group.user_set.all()
于 2008-12-18T19:03:38.537 に答える
19

グループのアクセス許可については、アクセス許可はグループに対して保存され、ユーザーはグループにリンクされていると思います。したがって、ユーザーとグループの関係を解決するだけです。

例えば

518$ python manage.py shell

(InteractiveConsole)
>>> from django.contrib.auth.models import User, Group
>>> User.objects.filter(groups__name='monkeys')
[<User: cms>, <User: dewey>]
于 2008-12-18T19:11:08.427 に答える
12

@Gladerの答えに基づいて、この関数はそれを単一のクエリにまとめ、スーパーユーザーを取得するように変更されました(定義により、すべてのパーマがあります):

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')
于 2013-09-05T14:11:06.703 に答える
8

異なるアプリが同じコードネームを再利用する可能性があるため、許可コードネームを指定するだけでは不十分であることを忘れないでください。ユーザーを正しくクエリするには、アクセス許可オブジェクトを取得する必要があります。

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

于 2016-06-09T09:53:24.570 に答える
1

グループはユーザーと多対多であるため (ご覧のとおり、何も変わったことはありません。Django モデルだけです...)、cms による答えは正しいです。さらに、これは両方の方法で機能します。グループを持つと、user_set属性を調べることでその中のすべてのユーザーを一覧表示できます。

于 2008-12-22T14:34:18.107 に答える
0

これを試して:

User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))
于 2009-01-19T10:02:34.240 に答える
0

@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()
于 2016-01-13T22:21:50.313 に答える