2017-09-11 18 views
-1

私はしばらく見てみましたが、特定の問題の解決策を見つけられなかったので、事前にお詫びします。アソシエーションパターンを使用したSQLAlchemyの多対多自己参照ORM

と仮定私はテーブルのユーザーと、次のモデルを持っているし、次の:外部キーに応じて、異なる意味があることを

 ________   src  ________ 
    | User |-1------------*-| Follow | 
    |--------|    |--------| 
    | id  |    | src_id | 
    |  |    | dst_id | 
    |  |    | string | 
    |________|-1------------*-|________| 
         dst 

ていることに注意してください。

"アソシエーションパターン"(described here)でこれを達成しようとしていますが、動作させることができます。これは次のようになります。

class Follow(Base): 
    __tablename__ = 'follows' 
    # 
    src_id = Column(BigInteger, ForeignKey('users.id'), primary_key=True) 
    dst_id = Column(BigInteger, ForeignKey('users.id'), primary_key=True) 

    src = relationship("User", back_populates="followers", foreign_keys=[src_id]) 
    dst = relationship("User", back_populates="followees", foreign_keys=[dst_id]) 

    kind = Column(String(16)) 

class User(Base): 
    __tablename__ = 'users' 

    name = Column(String(20)) 

    followers = relationship("UUEdge", primaryjoin="User.id==UUEdge.dst_id") 
    followees = relationship("UUEdge", primaryjoin="User.id==UUEdge.src_id") 

これは可能ですか?私は何か間違っているのですか?

乾杯

P.S.鉱山に答えていない

同様の質問:

How can I achieve a self-referencing many-to-many relationship on the SQLAlchemy ORM back referencing to the same attribute?

+1

「UUEdge」とは何ですか? 'Follow'では' back_populates'を使用しましたが、もう一方は使用しませんでした。また、明確な問題定義を指定すると助けになります。 "私はそれを働かせることはできない"というのはあいまいです。 –

+0

には適切な[mcve]が含まれていることを確認し、問題が発生していることをコードで確認して再現し、発生している可能性のあるエラーメッセージを追加してください。 –

答えて

0

これは私が参加し、テーブルを使用して私のプロジェクトでのフォロワーの関係を実装する方法です。

followers = Table(
    'followers', metadata, 
    Column('user_id', Integer, 
     ForeignKey('users.user_id'), primary_key=True), 
    Column('follower_id', Integer, 
     ForeignKey('users.user_id'), primary_key=True), 
) 

class User(Base): 

    __tablename__ = 'users' 

    user_id = Column(Integer, primary_key=True) 

    followers = relationship(
     'User', secondary=followers, cascade='all', lazy='dynamic', 
     primaryjoin=followers.c.user_id == user_id, 
     secondaryjoin=followers.c.follower_id == user_id) 


# do some following! 
user = session.query(User).get(..) 
follower = User() 
user.followers.append(follower) 
関連する問題