2012-03-10 59 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)