Django:过滤ManyToMany加入

时间:2012-03-10 14:11:26

标签: python django django-orm

我有app订阅者订阅各种列表。 这里的域名是:List model / SubscriberModel / ListSubscription model。

List类定义包含以下行

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

虽然这段代码允许我获得所有订阅者,但我只需要其中一些订阅者。诀窍是ListSubscription class包含“is_active”布尔字段,用于标识活动或非活动的订阅。 是否有一些直接的解决方案可以为多对多的连接添加“is_active = True”? 在纯SQL中我会将这个条件添加到join子句中,但不确定Django ORM方式。

这里的理想结果是能够使用查询集来获取具有相应*活跃“订阅者的所有列表。

1 个答案:

答案 0 :(得分:2)

ManyToMany字段已经是一个查询集,因此如果您想要活跃订阅者,您可以通过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)