2015-06-19 156 views
1

使用SQLAlchemy,我無法弄清楚如何映射下列關係:用戶可以被其他用戶「跟蹤」,從而成爲「追隨者」的「領導者」。SQLAlchemy關係加入多個外鍵

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key = True) 
    followers = relationship('User', primaryjoin = 'and_(User.id == UserFollower.leader_id)', cascade = 'all') 
    leaders = relationship('User', primaryjoin = 'and_(User.id == UserFollower.follower_id)', cascade = 'all') 

class UserFollower(Base): 
    __tablename__ = 'users_followers' 
    leader_id = Column(Integer, ForeignKey('users.id'), primary_key = True) 
    follower_id = Column(Integer, ForeignKey('users.id'), primary_key = True) 
    follower = relationship('User', uselist = False, foreign_keys = [ follower_id ]) 
    leader = relationship('User', uselist = False, foreign_keys = [ leader_id ]) 

從文檔我的印象中,這樣的聲明將有

some_user.followers 

執行上「users.id = users_followers.leader_id聯接的「用戶」和「users_followers」表'where'user.id = some_user.id'。

但是,這會產生錯誤(類似於How to specify table relationships in SQLAlchemy with multi-level/multiple joins?)。儘管提出的解決方案允許我解決此問題,但它可以防止使用SQLAlchemy關係的「級聯」屬性,因此在刪除用戶時,相應的UserFollower對象也會被刪除。

總結:我怎麼能有關係加入到表的多個外鍵指的是相同的密鑰和保存仍然級聯(刪除)?

回答

2

如果您閱讀SQLAlchemy文檔的Self-Referential Many-to-Many Relationship部分,您將意識到您擁有經典的多對多關係。如果根據文檔定義這種關係,級聯將工作得很好:

users_followers = Table(
    'users_followers', Base.metadata, 
    Column('leader_id', ForeignKey('users.id'), primary_key=True), 
    Column('follower_id', ForeignKey('users.id'), primary_key=True), 
) 


class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 

    followers = relationship(
     'User', 
     secondary=users_followers, 
     primaryjoin=id == users_followers.c.leader_id, 
     secondaryjoin=id == users_followers.c.follower_id, 
     backref="leaders", 
     cascade='all', 
    ) 
+0

事實上,這是一個直接應用。我完全錯過了。謝謝! – OnMyLittleDuck