2012-03-10 6 views
1

У меня есть приложение, в котором подписчики подписываются на различные списки. Домен: Список моделей/SubscriberModel/ListSubscription model.Django: filter ManyToMany join

Определение класса Список содержит следующую строку

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

Хотя этот код позволяет мне получить все абоненты, мне нужны только некоторые из них. фокус в том, что класс ListSubscription содержит «is_active» логическое поле, идентифицирующее подписки, которые являются активными или неактивными. Есть ли какое-то решение straighforward для добавления «is_active = True» для многих из многих? В простом SQL я бы добавил это условие к предложению join, но не уверен в способе Django ORM.

Идеальный результат здесь будет возможность иметь QuerySet, чтобы получить все списки с соответствующими * активных»абонентов.

ответ

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)