2012-03-10 66 views
1

我有应用程序订阅者订阅各种列表。 这里的域名是:List model/SubscriberModel/ListSubscription model。Django:过滤ManyToMany加入

列表类的定义包含以下行

subscribers = models.ManyToManyField(Subscriber, through='ListSubscription') 

尽管此代码可以让我获得所有用户的,我只需要其中的一些。诀窍是ListSubscription 类包含“is_active”布尔字段标识处于活动状态或非活动状态的订阅。 是否有一些直接的解决方案将“is_active = True”添加到多对多连接中? 在纯SQL中,我会将此条件添加到连接子句中,但不确定Django ORM的方式。

这里理想的结果将是有一个查询集来获取所有列出与相应的*活跃”用户的能力。

回答

1

一个ManyToMany领域已经是一个QuerySet,所以如果你想要的活跃用户,你可以直接调用它的。filter方法,或许经由List类的方法,该through表是可用于过滤以同样的方式作为目标表:

class List(models.Model): 
    # ... etc ... 
    @property 
    def active_subscribers(self): 
     return self.subscribers.filter(listsubscription__is_active = True) 

要与至少一个激活的用户返回列表,使用以下查询:

List.objects.filter(listsubscription__is_active = True)