3

モデル自体との多対多の関係を構成する際に問題が発生します。通常の関係構成を使用する場合、つまり、Associationオブジェクトを使用しない場合は、自己多対多の関係を構成できます。

このシナリオでは、多対多のテーブル自体にいくつかの追加情報を記録する必要があるため、Associationオブジェクト(PageLink)を使用して関係を実装しようとしています。

こちらがモデルです。

class PageLink(Base):
    '''
    Association table.
    '''
    __tablename__ = 'page_links'

    id = Column(Integer,primary_key=True)
    page_from = Column(Integer,ForeignKey('page.id'),primary_key=True)
    page_to = Column(Integer,ForeignKey('page.id'),primary_key=True)
    extra_col1 = Column(String(256),nullable=False)

class Page(Base):
    '''
    main table
    '''

    __tablename__ = 'page'

    id = Column(Integer,primary_key=True)
    name = Column(String(56),nullable=False)

    linked = relationship('PageLinks',backref='parent_page',
                          primaryjoin=id==PageLink.page_from,
                          secondaryjoin=id==PageLink.page_to)

このアプローチは機能しません。'secondaryjoin'キーワードを削除しようとしましたが、機能しません。

この問題に関するヘルプやアドバイスをいただければ幸いです。

読んでくれてありがとう。

4

1 に答える 1

5

アソシエーションオブジェクトパターンは、多対多の関係を特殊化したものではなく、1対多の関係の特殊なケースであり、1対1の関係がleft_table設定association_tableright_tableれています。つまり、 2つの関係が必要ですが、どちらにもsecondary/はありませんsecondaryjoin

class PageLink(Base):
    '''
    Association table.
    '''
    __tablename__ = 'page_links'

    id = Column(Integer,primary_key=True)
    page_from = Column(Integer,ForeignKey('page.id'),primary_key=True)
    page_to = Column(Integer,ForeignKey('page.id'),primary_key=True)
    extra_col1 = Column(String(256),nullable=False)

class Page(Base):
    '''
    main table
    '''

    __tablename__ = 'page'

    id = Column(Integer,primary_key=True)
    name = Column(String(56),nullable=False)

    linked_to = relationship('PageLinks',backref='parent_page',
                             primaryjoin=id==PageLink.page_from)
    linked_from = relationship('PageLinks',backref='child_page',
                               primaryjoin=id==PageLink.page_to)

つまり、あるページから「to」リンクの追加の列にアクセスするには、次のp操作を行う必要があります。p.linked_to[0].extra_col1、または実際のリンクされたページを取得するには、p.linked_to[0].page_to


余談ですが、自動インクリメントの主キーまたは(左/右)外部キーのペアのいずれかを関連付けの主キーとして使用することは多くの場合優れたアイデアですが、両方を主キーに含めることはほとんど役に立ちません。両方のアイデアを組み合わせる別の方法は、主キーの唯一の列として自動インクリメント整数を使用し、左右の外部キー列に追加の一意性制約を設定することです。

于 2011-08-31T18:41:25.727 に答える