2

背景:

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

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

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

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

问题:

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

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

4

1 回答 1

1

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

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

旁注:

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

使用car_owner而不是carOwner,python中的属性名称最好全部小写并用下划线分隔

于 2013-11-10T20:38:30.953 回答