我正在尝试使用contains_eager选项急切地加载一个自我关系属性,以避免在使用关系列之一进行排序或搜索时出现两个连接。我的模型对象看起来像:
class Usuario(DeclarativeBase):
__tablename__ = 'usuarios'
__table_args__ = {'mysql_engine':'InnoDB'}
id=Column(Integer, primary_key=True)
usuario=Column(Text)
...
resellers_id=Column(Integer, ForeignKey('usuarios.id'))
....
reseller = relation('Usuario', remote_side = [id])
我用来获取数据:
u= DBSession.query(Usuario).options(contains_eager('reseller'))\
.outerjoin(self.usuarios_padre, Usuario.resellers_id == self.usuarios_padre.id)\
.filter(Usuario.id=1)\
.order_by(self.usuarios_padre.usuario).one()
其中 self.usuarios_padre 是Usuario的别名
如果我访问 u.reseller.usuario ,我会与 u.usuario 相同,而不是从父母那里获取usuario
知道问题出在哪里?我试图使用lazy =“joined”来定义关系而没有结果。
此致
答案 0 :(得分:1)
问题是您在一个查询中加载了两组Usuario
个对象,为了解决问题,您需要使用aliased然后明确地在join
和contains_eager
中指定别名父:
qry = session.query(Usuario).filter(Usuario.id==1)
# join using the aliased. Use *outerjoin* in order to still get the result for those without a parent
res = aliased(Usuario)
qry = qry.outerjoin((res, Usuario.reseller))
# specify which table/alias represents the *contained* relationship
qry = qry.options(contains_eager(Usuario.reseller, alias=res))