ProgramingTip

Django에서 특정 권한 그룹을 가진 모든 사용자 목록을 얻는 방법

bestdevel 2020. 12. 14. 20:37
반응형

Django에서 특정 권한 그룹을 가진 모든 사용자 목록을 얻는 방법


특정 권한 그룹을 가진 모든 Django 인증 사용자 목록을 가져오고 싶습니다.

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 모델 만 ...) 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()

이 시도:

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의 대답에서 단순화)

참고 URL : https://stackoverflow.com/questions/378303/how-to-get-a-list-of-all-users-with-a-specific-permission-group-in-django

반응형

'ProgramingTip' 카테고리의 다른 글

.NET 2.0 실행의 LINQ  (0) 2020.12.14
Python 인수  (0) 2020.12.14
자동으로 INotifyPropertyChanged  (0) 2020.12.14
LaTeX의 반복  (0) 2020.12.14
십진수 속성을 통화로 포맷하는 방법  (0) 2020.12.14