0

我正在尝试使用 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" 来定义关系,但没有结果。

问候

4

1 回答 1

1

问题是您在一个查询中加载了两组Usuario对象,为了解决这个问题,您需要使用别名,然后在和中明确指定别名级:joincontains_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))
于 2012-05-21T11:01:09.997 回答