Вы правы, таблица 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)
)