2011-08-31 58 views
3

我在配置與模型本身的多對多關係時遇到問題。當我使用normal關係配置,即不使用關聯對象時,我可以配置自我多對多關係。SQLAlchemy配置多對多關係到自我使用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'關鍵字,但它不起作用。

非常感謝在這個問題上的任何幫助或建議。

謝謝您的閱讀。

回答

5

的關聯對象模式是不是一個一對多關係的許多一對多的關係,而是一種特殊情況的sepecialization,你有一個left_table - 多到一 - association_table - 一對 - 許多 - right_table成立。總之,你需要兩個關係,這兩個關係都不應該有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) 

這意味着,訪問額外的列在「到」從p一些頁面鏈接,你要做的:p.linked_to[0].extra_col1,或者獲得實際的鏈接頁面,p.linked_to[0].page_to


由於除此之外,使用自動增量主鍵或(左/右)外鍵對作爲關聯中的主鍵通常是一個好主意,但在主鍵中幾乎沒有用處。將兩種想法結合起來的替代方法是將自動增量整數用作主鍵中的唯一列,並且在左/右外鍵列上具有附加的唯一約束。

+1

對,就是這樣。 – kaneer

+0

謝謝,真的很有幫助 – anvd