SQLAlchemy使用Association配置与self的多对多关系

时间:2011-08-31 18:05:52

标签: python orm sqlalchemy flask-sqlalchemy

我遇到了与模型本身配置多对多关系的问题。当我使用normal关系配置(即不使用关联对象的配置)时,我可以配置自多对多关系。

在这种情况下,我必须在多对多表中记录一些额外的信息,所以我试图使用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'关键字,但它不起作用。

非常感谢有关此事的任何帮助或建议。

感谢您的阅读。

1 个答案:

答案 0 :(得分:5)

关联对象模式不是多对多关系的特殊化,而是一对多关系的特殊情况,其中有left_table - 多对一 - {{ 1}} - 一对多 - 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


顺便说一下,使用自动增量主键或(左/右)外键对作为关联中的主键通常是个好主意,但在主键中同时使用它们几乎没有用。结合两种想法的替代方案是使用自动增量整数作为主键中的唯一列,并在左/右外键列上具有附加的唯一约束。