2011-06-26 13 views
0

私はsqlalchemyのリレーションシップ内のリレーションシップにちょっと悩まされています。SQLAlchemyの既存の関係から関係を作成するには?

engine = create_engine('sqlite:///tvdb.db', echo=True) 
Base = declarative_base(bind=engine) 

episodes_writers = Table('episodes_writers_assoc', Base.metadata, 
    Column('episode_id', Integer, ForeignKey('episodes.id')), 
    Column('writer_id', Integer, ForeignKey('writers.id')), 
    Column('series_id', Integer, ForeignKey('episodes.series_id')) 

class Show(Base): 
    __tablename__ = 'shows' 

    id = Column(Integer, primary_key = True) 
    episodes = relationship('Episode', backref = 'shows') 

class Episode(Base): 
    __tablename__ = 'episodes' 

    id = Column(Integer, primary_key = True) 
    series_id = Column(Integer, ForeignKey('shows.id')) 
    writers = relationship('Writer', secondary = 'episodes_writers', 
          backref = 'episodes') 

class Writer(Base): 
    __tablename__ = 'writers' 

    id = Column(Integer, primary_key = True) 
    name = Column(Unicode) 

だから、1対多のショーやエピソードの間、および多対多のエピソードや作家との間にありますが、私は今、多対多を作成したい:私はこのようなモデルは持っていますライターがショーのエピソードに関連付けられているという事実に基づいて、ショーとライターの関係私は連想テーブルに別の列を追加しようとしましたが、それは、次の例外が発生:だから私は、明らかに私の関係の宣言と間違って何かをやっている

sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship Episode.writers. Specify a 'primaryjoin' expression. If 'secondary' is present, 'secondaryjoin' is needed as well. 

。私がここで何をしようとしているのかを達成するために正しいプライマリ・ジョイントを作成するにはどうしたらいいですか?

答えて

0

修正プログラムは、エラーメッセージの欄に記載されています。とにかく、スキーマを非正規化する列は必要ありません。 writer.showsはassociationproxyにすることができます。

+0

私はライターでassociation_proxyを設定しようとしました: 'shows = association_proxy( 'episodes'、 'shows')'これは作家に関連する各エピソードのショーのリストを返します。私はこれがちょうど作家に関連付けられているユニークなショーを返すようにしていた... – emergence

+0

@Ben多分[collection_type = set](http://www.sqlalchemy.org/docs/orm/collections.html#custom-collections )? – Tobu

関連する問題