我有一个表用户和一个表朋友,将用户映射到其他用户,因为每个用户可以有很多朋友.这个关系显然是对称的:如果用户A是用户B的朋友,那么用户B也是用户A的朋友,我只存储这个关系一次. Friends表除了两个User ID之外还有其他字段,所以我必须使用一个关联对象.
我试图在用户类(扩展声明基础)中的声明式样中定义这种关系,但我似乎无法弄清楚如何做到这一点.我希望能够通过财产的朋友访问给定用户的所有朋友,所以说朋友= bob.friends.
这个问题最好的办法是什么?我尝试了许多不同的设置发布在这里,没有一个工作原因各异.
编辑:我的最新尝试如下:
class User(Base): __tablename__ = 'users' id = Column(Integer,primary_key=True) # Relationships friends1 = relationship('Friends',primaryjoin=lambda: id==Friends.friend1ID) friends2 = relationship('Friends',primaryjoin=lambda: id==Friends.friend2ID) class Friends(Base): __tablename__ = 'friends' id = Column(Integer,primary_key=True) friend1ID = Column(Integer,ForeignKey('users.id') ) friend2ID = Column(Integer,ForeignKey('users.id') ) status = Column(Integer) # Relationships vriend1 = relationship('Student',primaryjoin=student2ID==Student.id) vriend2 = relationship('Student',primaryjoin=student1ID==Student.id)
但是,这会导致以下错误:InvalidRequestError:已为此MetaData实例定义了表’users’.指定’extend_existing = True’以重新定义现有Table对象上的选项和列.
我必须承认,在这一点上,由于许多失败的尝试,我彻底困惑,可能在上述方面犯了不止一个愚蠢的错误.