Django: фильтр присоединиться к ManyToMany - PullRequest
1 голос
/ 10 марта 2012

У меня есть приложение, где подписчики подписываются на различные списки. Домен здесь: Модель списка / Модель подписчика / Модель списка подписок.

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

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

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

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

1 Ответ

2 голосов
/ 10 марта 2012
Поле

A 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)
...