You are right, all information in sqlalchemy docs under Self-Referential Query Strategies
. In which case your initial query would look something like this:
from sqlalchemy.orm import aliased
page1 = aliased(Page)
page2 = aliased(Page)
qry = (session
.query(Page).filter(Page.slug=='currentlevel')
.join(page1, Page.parent).filter(page1.slug=="secondlevel")
.join(page2, page1.parent).filter(page2.slug=="firstlevel")
)
Or, using aliased
(with from_joinpoint
) arguments, somewhat shorter:
qry = (session
.query(Page).filter(Page.slug=='currentlevel')
.join(Page.parent, aliased=True).filter(Page.slug=="secondlevel")
.join(Page.parent, aliased=True, from_joinpoint=True).filter(Page.slug=="firstlevel")
)