[英]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.