2008-12-18 58 views
46

Tôi muốn có được một danh sách tất cả Django auth người dùng với một nhóm cho phép cụ thể, một cái gì đó như thế này:Làm thế nào để có được một danh sách của tất cả các người dùng với một nhóm cho phép cụ thể trong Django

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

tôi không thể tìm ra làm như thế nào. Các nhóm quyền được lưu trong mô hình người dùng như thế nào?

Trả lời

59

Nếu bạn muốn nhận được danh sách người dùng bởi sự cho phép, nhìn vào biến thể này:

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

Tôi có một Mô hình cơ bản có yêu cầu này - lọc danh sách người dùng trên một cấp độ đối tượng nhất định (django-guardian). Cách tốt nhất để làm điều này - trên Mô hình, trên một ModelForm hoặc một Biểu mẫu riêng biệt là gì? –

+0

Tôi nghĩ rằng truy vấn này cần một '| Q (is_superuser = True) ';) – marcelm

41

Đây sẽ là dễ nhất

from django.contrib.auth import models 

group = models.Group.objects.get(name='blogger') 
users = group.user_set.all() 
16

Tôi nghĩ rằng cho phép nhóm, điều khoản được lưu trữ chống lại các nhóm, và sau đó người dùng có các nhóm liên quan đến chúng. Vì vậy, bạn chỉ có thể giải quyết mối quan hệ người dùng - nhóm.

ví dụ:

518$ python manage.py shell 

(InteractiveConsole) 
>>> from django.contrib.auth.models import User, Group 
>>> User.objects.filter(groups__name='monkeys') 
[<User: cms>, <User: dewey>] 
+0

Cảm ơn, cố định nó, tôi biết nên đơn giản. Vấn đề duy nhất là nếu tên nhóm được thay đổi, có lẽ tôi nên lọc nó trên ID hoặc một cái gì đó thay vì ... Nhưng cảm ơn! – espenhogbakk

1

Nhóm rất nhiều người dùng (bạn thấy đấy, không có gì khác thường, chỉ là mô hình Django ...), vì vậy câu trả lời bằng cms là đúng. Thêm vào đó, nó hoạt động theo cả hai cách: có một nhóm, bạn có thể liệt kê tất cả người dùng trong nhóm bằng cách kiểm tra thuộc tính user_set.

0

Hãy thử điều này:

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

Dựa trên @ câu trả lời Glader của, chức năng này kết thúc tốt đẹp nó lên trong một truy vấn đơn lẻ, và đã được sửa đổi để có được các superusers (theo định nghĩa, chúng có tất cả các 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') 
0

Dựa trên @Aug Câu trả lời của usto, tôi đã làm như sau với một người quản lý mô hình và sử dụng thư viện authtools. Đây là trong 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() 

Và sau đó trong models.py:

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


class User(AbstractEmailUser): 
    objects = UserManager() 
2

Đừng quên rằng việc xác định sự cho phép tên mã là chưa đủ vì các ứng dụng khác nhau có thể tái sử dụng các tên mã tương tự. Một nhu cầu để có được đối tượng cho phép để truy vấn người sử dụng một cách chính xác:

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

Mã với hàng nhập khẩu: https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/models.py

0
$ 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)...'] 

(đơn giản hóa từ câu trả lời cms', mà tôi không thể chỉnh sửa)

Các vấn đề liên quan