在contains_eager()中指定具有继承层次结构的实体的完整路径

时间:2013-01-19 12:25:42

标签: python sqlalchemy

我有一个像

这样的查询
(session.query(Root).with_polymorphic('*')
    .outerjoin(Subclass.related1).options(contains_eager(Subclass.related1)))

到目前为止一切正常。

我还想热切地加载Related1.related2,我尝试了这个:

(session.query(Root).with_polymorphic('*')
    .outerjoin(Subclass.related1).options(contains_eager(Subclass.related1))
    .outerjoin(Related1.related2).options(contains_eager(Related1.related2)))

但它不起作用:

  

sqlalchemy.exc.ArgumentError:在此Query中指定的任何实体上找不到属性“related2”。请注意,必须指定从根(Mapper | Root | root)到目标实体的完整路径。

鉴于related1通过子类与根实体相关,我看不到如何指定完整路径。

我也试过

(session.query(Root).with_polymorphic('*')
    .outerjoin(Subclass.related1).options(contains_eager(Subclass.related1))
    .outerjoin(Related1.related2).options(contains_eager('related1.related2')))

可预测地失败

  

sqlalchemy.exc.ArgumentError:在此查询中找不到映射的实体Mapper | Root | root上名为“related1”的属性。

如何在contains_eager()

中指定间接相关实体的完整路径

1 个答案:

答案 0 :(得分:10)

contains_eager需要查询知道的实体的完整路径:

contains_eager(Subclass.related1, Related1.related2)