0

私は多対多の関係を持っており、リレーションテーブルには主キーだけよりも多くの列が含まれています。例として、各画像に独自のタイムアウトを設定し、スライドショーに応じてタイムアウトを設定できるスライドショーシステムについて考えてみます。ちょっとした例ですが、説明のために行う必要があります;)

だから私は次のようなことをするだろうと想像します(宣言型を使用して):

show_has_image = Table( 'show_has_image',
      DeclarativeBase.metadata,
      Column( 'show_id', Integer, ForeignKey( 'show.id' ) ),
      Column( 'image_id', Integer, ForeignKey( 'image.id' ) ),
      Column( 'timeout', Integer, default=5 ),
      PrimaryKeyConstraint( 'show_id', 'image_id' )
      )

class Show(DeclarativeBase):
   __tablename__ = "show"

   id = Column( Integer, primary_key = True )
   name  = Column( Unicode(64), nullable = False)

class Image(DeclarativeBase):
   __tablename__ = "image"

   id   = Column( Integer, primary_key = True )
   name = Column( Unicode(64), nullable = False)
   data = Column(Binary, nullable = True)
   show = relation( "Show",
         secondary=show_has_image,
         backref="images" )

「タイムアウト」値にアクセスするにはどうすればよいですか?これに関するドキュメントには何も見つかりません。これまでのところ、画像の取得は簡単です。

show = DBSession.query(Show).filter_by(id=show_id).one()
for image in show.images:
    print image.name
    # print image.timeout <--- Obviously this cannot work, as SA has no idea
    #                          how to map this field.

前のコードで概説したように機能することを嬉しく思います。確かに、値を動的にフェッチするtimeoutプロパティをクラスに追加できます。Imageただし、その結果、不要なSQLクエリが発生します。

むしろ、すべてを1つのクエリで返すようにしたいです。SQLでは簡単です。

    SELECT i.name, si.timeout
      FROM show s
INNER JOIN show_has_image si ON (si.show_id = s.id)
INNER JOIN image i ON (si.image_id = i.id)
     WHERE s.id = :show_id
4

1 に答える 1

1

show_has_image テーブル (複合主キーを使用) に基づいて中間モデルを定義し、それとの関係を定義できます。次に、プロパティassociation_proxyを定義するために使用しますShow.images

于 2010-02-08T12:18:20.227 に答える