同表多对多关系与关联对象

4 投票
1 回答
1095 浏览
提问于 2025-04-15 23:59

相关内容(针对没有关联对象的情况):SQLAlchemy在单个表上的多对多关系

建立多对多关系很简单。在同一个表上建立多对多关系也差不多简单,正如上面的问题所描述的那样。

使用关联对象建立多对多关系也很简单。

我找不到的就是如何正确地将关联对象和多对多关系结合起来,而且左右两边都是同一个表。

所以,我从一个简单、幼稚、明显错误的版本开始,这个版本我花了很长时间想要调整成正确的版本:

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 个回答

6

我猜你遇到了一个错误,内容是 无法确定父表和子表之间的连接条件...。在这种情况下,你可以把 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 对象中方便地查看它们之间的关系了。

撰写回答