0

リレーション列の 1 つを使用して順序付けまたは検索するときに 2 つの結合を回避するために、contains_eager オプションを使用して 1 つのセルフリレーション プロパティを積極的にロードしようとしています。私のモデルオブジェクトは次のようになります:

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 のエイリアスの 1 つです

u.reseller.usuarioにアクセスすると、親からusuarioを取得する代わりにu.usuarioと同じものを取得します

どこに問題があるのか​​ わかりますか?結果なしで lazy="joined" を使用して関係を定義しようとしました。

よろしく

4

1 に答える 1

1

問題は、1つのクエリで2セットの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 に答える