[英]Self-referencing many-to-many relationship with an association object in SQLAlchemy
[英]SQLAlchemy configuring many-to-many relationship to self using Association
我遇到了與模型本身配置多對多關系的問題。 當我使用普通關系配置(即不使用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'關鍵字,但它不起作用。
非常感謝有關此事的任何幫助或建議。
謝謝你的閱讀。
關聯對象模式不是多對多關系的特殊化,而是一對多關系的特殊情況,其中你有一個left_table
- Many-To-One - 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
訪問'to'鏈接的額外列,您必須執行: p.linked_to[0].extra_col1
,或者獲取實際的鏈接頁面, p.linked_to[0].page_to
順便說一句,使用自動增量主鍵或(左/右)外鍵對作為關聯中的主鍵通常是一個好主意,但在主鍵中同時使用它們幾乎沒有用。 結合這兩種想法的替代方案是使用自動增量整數作為主鍵中的唯一列,並在左/右外鍵列上具有附加的唯一約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.