1

这是我正在使用的三个非常简化的类:

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)

这行得通,但是,我希望能够为membership__is_tech / __is_billing / __is_admin / __is_foo / __is_bar / __is_quux / 等动态创建查询什么是最pythonic / djangonic的方法?

4

2 回答 2

1

最 Pythonic/djangonic(也是最规范化)的方法是不将is_billing /is_admin/is_tech 作为字段包含到您的会员模型中,而是添加一个可以获取“admin/billing/tech”的“department”字段值(或者是 Department 模型的 ForeignKey)。

如果您想拥有两个部门(例如 adminblling),则将 ManyToMany 字段添加到 Department 模型。

于 2013-11-10T18:26:38.967 回答
1

鉴于您只有一组字段,我不太确定动态创建查询是什么意思。但是您也许可以使用查询是函数的关键字参数这一事实,因此可以用字典和**语法替换:

kwargs = {'membership__is_tech': True}
ms_tech = microsoft.filter(**kwargs)

objects(请注意,您提供的过滤器中应该没有,因为microsoft它已经是查询集,而不是模型。)

于 2013-11-10T19:20:56.927 回答