特定の許可グループを持つすべての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の答えに基づいて、この関数はそれを単一のクエリでラップし、スーパーユーザーを取得するように変更されています(定義により、すべての権限があります)。
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モデル...)。 、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()
これを試して:
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)...']
(編集できないcmsの回答から簡略化)