以下是我正在使用的三个非常简化的课程:
class User(AbstractBaseUser):
email = models.EmailField()
name = models.CharField()
is_admin = models.BooleanField()
phone_number = models.CharField()
class Accounts(models.Model):
name = models.CharField()
users = models.ManyToManyField(settings.USR_MODEL, through='Membership',
null=True, blank=True)
customer_id = models.IntegerField()
class Membership(models.Model):
user = models.ForeignKey(User)
company = models.ForeignKey(Accounts)
is_admin = models.BooleanField(default=False)
is_billing = models.BooleanField(default=False)
is_tech = models.BooleanField(default=False)
我希望能够获得与帐户关联的用户,并通过布尔属性is_admin,is_billing,is_tech对其进行过滤。现在我正在做:
microsoft = Accounts.objects.get(customer_id=1)
然后我可以通过
获得技术联系ms_tech = microsoft.filter(membership__is_tech=True)
然而,这是有效的,我希望能够动态创建成员资格的查询_is_tech / __is_billing / __is_admin / __is_foo / __is_bar / __is_quux / etc这样做的最pythonic / djangonic方式是什么?
答案 0 :(得分:1)
最pythonic / djangonic(也是最常规化)的方法是不将is_billing / is_admin / is_tech包含在您的Membership模型中作为字段,但添加“department”字段可以获得“admin / billing / tech”值(或者是您的部门模型的ForeignKey)。
如果您想拥有两个部门(例如admin 和 blling),请将ManyToMany字段添加到Department模型中。
答案 1 :(得分:1)
我不确定动态创建查询的含义,因为您只有一定数量的字段。但是你可以使用查询是函数的关键字参数的事实,因此可以用字典和**
语法替换:
kwargs = {'membership__is_tech': True}
ms_tech = microsoft.filter(**kwargs)
(请注意,您提供的过滤器中不应该有objects
,因为microsoft
已经是查询集,而不是模型。)