Как отфильтровать по загруженной таблице в SqlAlchemy? - PullRequest
8 голосов
/ 17 октября 2011

Допустим, у меня есть 2 модели, Document и Person.Document получил отношение к Person через свойство "owner".Теперь:

session.query(Document)\
    .options(joinedload('owner'))\
    .filter(Person.is_deleted!=True)

Будет ли двойное присоединение к столу Person.Будет выбрана таблица из одного человека, а дублированная будет отфильтрована, что не совсем то, что я хочу, потому что строки документа не будут отфильтрованы.

Что я могу сделать, чтобы применить фильтр к объединенной таблице / модели?

1 Ответ

17 голосов
/ 18 октября 2011

Вы правы, таблица Person будет использоваться дважды в результирующем SQL, но каждый из них служит разным целям:

  • необходимо отфильтровать условие: filter(Person.is_deleted != True)
  • Другой способ загрузить отношения: options(joinedload('owner'))

Но причина, по которой ваш запрос возвращает неверные результаты, заключается в том, что условие фильтра не выполнено. Чтобы получить правильные результаты, вам также необходимо присоединиться к двум моделям:

qry = (session.query(Document).
        join(Document.owner). # THIS IS IMPORTANT
        options(joinedload(Document.owner)).
        filter(Person.is_deleted != True)
        )

Это вернет правильные строки, хотя у него все еще будет 2 ссылки (JOIN) на таблицу Person. Реальным решением для вашего запроса является использование contains_eager вместо joinload :

qry = (session.query(Document).
        join(Document.owner). # THIS IS STILL IMPORTANT
        options(contains_eager(Document.owner)).
        filter(Person.is_deleted != True)
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...