如何根据用户组和&amp ;;过滤模型对象权限?

时间:2013-11-10 20:26:52

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

背景:

我想知道如何根据模型用户外键&&amp ;;来过滤模型查询集结果。它的相关名称,组和&权限。这是我想要发生的一个简单例子:

  • 让我们说每个员工都可以使用公司汽车(只读状态)
  • 还可以说任何员工也可以选择使用自己的车(只能由车主修改)

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

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

问题:

我已初步尝试解决方案,但想知道处理这种情况的“正确”方法。不用多说,这就是问题:

问:如何基于用户名,组和组合的组合来过滤模型?权限?

1 个答案:

答案 0 :(得分: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