【问题标题】:How to filter model objects based upon User groups & permissions?如何根据用户组和权限过滤模型对象?
【发布时间】:2013-11-22 13:40:43
【问题描述】:

背景:

我想知道如何根据模型用户外键 && 其关联名称、组和权限来过滤模型查询集结果。这是我希望发生的一个简单示例:

  • 假设有公司汽车可供每位员工使用(只读状态)
  • 还可以说,任何员工也可以选择使用自己的汽车(只能由所有者修改)

下面列出的是上面描述的场景,我最初尝试解决方案:

from django.contrib.auth.models import User
from django.db.models import Q

user1 = User.objects.create_user("Billy", 'bbob@gmail.com', 'pw');
user2 = User.objects.create_user("Johnny Boy", 'jbo@gmail.com', 'pw2');
user1.groups.add('employee')
user2.groups.add('employee')

class Car(models.Model):
     name = models.CharField(max_length=200)
     color = models.CharField(max_length=50)
     carOwner = models.OneToOneField('User')

qObj = Q(carOwner__user_username = user1.username) 

for empGroup in user1.groups:
    qObj |= Q(carOwner__groups__icontains = empGroup)

transOpts= Car.objects.filter(qObj) #All Transportation Options for given user

问题:

我已经提供了解决方案的初步尝试,但想知道处理这种情况的“正确”方法是什么。废话不多说,问题来了:

问:如何根据用户名、组和权限的组合过滤模型?

【问题讨论】:

    标签: django django-models django-admin django-queryset django-orm


    【解决方案1】:

    如果我理解正确,您希望所有汽车要么归用户所有,要么归同一组的用户所有。使用您的模型,您可能可以这样做(未经测试):

    Car.objects.filter(Q(carOwner=user) | Q(carOwner__groups__in=user.groups))
    

    旁注:

    这种方法可能会生成更好的查询,而不是对电子邮件和组名使用字符串比较,而是使用用户和用户的组 ID。

    使用car_owner而不是carOwner,python中的属性名称是preferably named all lower case and separated by underscore

    【讨论】:

    • 这个答案不再正确。而不是Q(carOwner__groups__in=user.groups)),你应该使用Q(carOwner__groups__name__in=user.groups))
    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2021-04-15
    相关资源
    最近更新 更多