首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在引用同一属性的SQLAlchemy对象关系管理中实现自引用多对多关系?

如何在引用同一属性的SQLAlchemy对象关系管理中实现自引用多对多关系?
EN

Stack Overflow用户
提问于 2012-02-03 01:27:13
回答 2查看 11.4K关注 0票数 32

我正在尝试在SQLAlchemy上使用声明式实现一个自引用的多对多关系。

该关系表示两个用户之间的友谊。我在网上发现了(在文档和谷歌中)如何建立一种自引用的m2m关系,其中角色以某种方式进行了区分。这意味着在这种m2m关系中,例如,UserA是用户B的老板,所以他将用户B列在“下属”属性或其他属性下。以同样的方式,UserB将UserA列在“上级”之下。

这不构成问题,因为我们可以用这种方式声明对同一个表的反向引用:

代码语言:javascript
复制
subordinates = relationship('User', backref='superiors')

所以,当然,“superiors”属性在类中是不显式的。

无论如何,这是我的问题:如果我想反向引用到调用backref的同一个属性,该怎么办?如下所示:

代码语言:javascript
复制
friends = relationship('User',
                       secondary=friendship, #this is the table that breaks the m2m
                       primaryjoin=id==friendship.c.friend_a_id,
                       secondaryjoin=id==friendship.c.friend_b_id
                       backref=??????
                       )

这是有道理的,因为如果A和B成为朋友,那么关系角色是相同的,如果我调用B的朋友,我应该得到一个包含A的列表。这是完整的有问题的代码:

代码语言:javascript
复制
friendship = Table(
    'friendships', Base.metadata,
    Column('friend_a_id', Integer, ForeignKey('users.id'), primary_key=True),
    Column('friend_b_id', Integer, ForeignKey('users.id'), primary_key=True)
)

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)

    friends = relationship('User',
                           secondary=friendship,
                           primaryjoin=id==friendship.c.friend_a_id,
                           secondaryjoin=id==friendship.c.friend_b_id,
                           #HELP NEEDED HERE
                           )

抱歉,如果这是太多的文本,我只是想要尽可能明确与这一点。我似乎在网上找不到任何关于这方面的参考资料。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9116924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档