django中的动态SQL连接查询

时间:2013-11-10 18:08:51

标签: python mysql sql django

以下是我正在使用的三个非常简化的课程:

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方式是什么?

2 个答案:

答案 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已经是查询集,而不是模型。)