与关联对象在同一张表上的多对多关系

Posted

技术标签:

【中文标题】与关联对象在同一张表上的多对多关系【英文标题】:Many-to-many relationship on same table with association object 【发布时间】:2010-06-15 08:52:31 【问题描述】:

相关(对于无关联对象用例):SQLAlchemy Many-to-Many Relationship on a Single Table

建立多对多关系很容易。在同一张表上建立多对多关系几乎与上述问题中所述一样容易。

与关联对象建立多对多关系也很容易。

我似乎找不到将关联对象和多对多关系组合在一起的正确方法,左侧和右侧是同一张表。

所以,从简单、幼稚且明显错误的版本开始,我一直在尝试将其转化为正确的版本:

t_groups = Table('groups', metadata,
    Column('id', Integer, primary_key=True),
)

t_group_groups = Table('group_groups', metadata,
    Column('parent_group_id', Integer, ForeignKey('groups.id'), primary_key=True, nullable=False),
    Column('child_group_id', Integer, ForeignKey('groups.id'), primary_key=True, nullable=False),
    Column('expires', DateTime),
)

mapper(Group_To_Group, t_group_groups, properties=
    'parent_group':relationship(Group),
    'child_group':relationship(Group),
)

映射这种关系的正确方法是什么?

【问题讨论】:

【参考方案1】:

我猜你遇到了类似Could not determine join condition between parent/child tables... 的错误 在这种情况下,将 Group_To_Group 的映射器更改为以下内容:

mapper(Group_To_Group, t_group_groups, properties=
    'parent_group':relationship(Group,
        primaryjoin=(t_group_groups.c.parent_group_id==t_groups.c.id),),
    'child_group':relationship(Group,
        primaryjoin=(t_group_groups.c.child_group_id==t_groups.c.id),),
)

您可能还想添加backref,以便您也可以导航来自Group 对象的关系。

【讨论】:

我昨晚一定是做错了什么。不过,它做到了,谢谢!

以上是关于与关联对象在同一张表上的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的多对多关联关系

SQLAlchemy 使用关联配置与自我的多对多关系

Hibernate:n-n关联关系

hibernate多对多关联映射

同一张表的多个关联(多对多)Ruby on Rails

Jpa之关联对象(单向多对多)