2012-05-21 87 views
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」定義關係而沒有結果。

問候

回答

1

的問題是,您加載兩套Usuario對象在一個查詢中,爲了解決這個問題,你需要使用aliased然後明確地指定的別名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))