How to get a list of all users with a specific per

2019-01-21 04:18发布

I want to get a list of all Django auth user with a specific permission group, something like this:

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

I cannot find out how to do this. How are the permissions groups saved in the user model?

9条回答
霸刀☆藐视天下
2楼-- · 2019-01-21 04:20

Try this:

User.objects.filter(groups__permissions = Permission.objects.get(codename='blogger'))
查看更多
成全新的幸福
3楼-- · 2019-01-21 04:22

If you want to get list of users by permission, look at this variant:

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()
查看更多
三岁会撩人
4楼-- · 2019-01-21 04:24

Groups are many-to-many with Users (you see, nothing unusual, just Django models...), so the answer by cms is right. Plus this works both ways: having a group, you can list all users in it by inspecting user_set attribute.

查看更多
孤傲高冷的网名
5楼-- · 2019-01-21 04:25
$ 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)...']

(simplified from cms' answer, which I can't edit)

查看更多
Root(大扎)
6楼-- · 2019-01-21 04:26

Based on @Glader's answer, this function wraps it up in a single query, and has been modified to algo get the superusers (as by definition, they have all perms):

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')
查看更多
Luminary・发光体
7楼-- · 2019-01-21 04:31

Based on @Augusto's answer, I did the following with a model manager and using the authtools library. This is in 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()

And then in models.py:

from django.db import models
from authtools.models import AbstractEmailUser
from .querysets import UserManager


class User(AbstractEmailUser):
   objects = UserManager()
查看更多
登录 后发表回答