【问题标题】:How to get a list of all users with a specific permission group in Django如何在Django中获取具有特定权限组的所有用户的列表
【发布时间】:2010-09-27 13:22:33
【问题描述】:

我想获取所有具有特定权限组的 Django auth 用户的列表,如下所示:

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

我不知道该怎么做。用户模型中的权限组是如何保存的?

【问题讨论】:

    标签: python django dictionary permissions


    【解决方案1】:

    如果您想按权限获取用户列表,请查看此变体:

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

    【讨论】:

    • 我有一个具有此要求的基本模型 - 在某个对象级权限(django-guardian)上过滤用户列表。执行此操作的最佳方式是什么 - 在模型上、在 ModelForm 上还是在单独的表单上?
    • 我认为这个查询需要| Q(is_superuser=True) ;)
    • 稍微更好和更懒的查询 - User.objects.filter(Q(groups__permissions__codename="blogger") | Q(user_permissions__codename="blogger") | Q(is_superuser=True))
    • @marcelm 很好,尽管在某些用例中这是不可取的,例如当获取的用户列表用于选择加入的操作时,即不应影响超级用户,除非他们明确地想要。
    【解决方案2】:

    这是最简单的

    from django.contrib.auth import models
    
    group = models.Group.objects.get(name='blogger')
    users = group.user_set.all()
    

    【讨论】:

      【解决方案3】:

      我认为对于组权限,权限是针对组存储的,然后用户将组链接到他们。所以你可以解决用户-组关系。

      例如

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

      【讨论】:

      • 谢谢,解决了,我知道应该很简单。唯一的问题是如果组名被更改,也许我应该用 ID 或其他东西过滤它......但是谢谢!
      【解决方案4】:

      根据@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')
      

      【讨论】:

        【解决方案5】:

        不要忘记仅指定权限代号是不够的,因为不同的应用可能会重复使用相同的代号。需要获取权限对象才能正确查询用户:

        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

        【讨论】:

        • 最佳答案。虽然请注意content_type__model=model 也应该包括在内。
        【解决方案6】:

        组与用户是多对多的(你看,没什么不寻常的,只是 Django 模型......),所以 cms 的答案是正确的。此外,这是双向的:拥有一个组,您可以通过检查 user_set 属性列出其中的所有用户。

        【讨论】:

          【解决方案7】:

          根据@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()
          

          【讨论】:

            【解决方案8】:

            试试这个:

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

            【讨论】:

              【解决方案9】:
              $ 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 的回答中简化,我无法编辑)

              【讨论】:

                猜你喜欢
                • 2011-06-07
                • 1970-01-01
                • 1970-01-01
                • 2014-08-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多