私はSQLAlchemyの宣言を使って自己参照多対多関係を実装しようとしています。同じ属性を参照するSQLAlchemy ORMで自己参照多対多リレーションシップをどのように達成できますか?
この関係は、2人のユーザー間の友情を表します。オンラインどのようにして役割が分かれているのか、自己参照のm2m関係を作る方法(ドキュメントとGoogleの両方)が見つかりました。つまり、このm2mの関係では、UserAはUserBの上司などであるため、「下位」属性の下にリストするか、何を持っているかを示します。同様に、UserBはUserAを '上司'の下に表示します。
私たちは、このように同じテーブルに後方参照を宣言することができるので、これは、何の問題を構成するものではありません:
subordinates = relationship('User', backref='superiors')
だから、当然のことながら、「上司」属性は、クラス内で明示的ではありません。
とにかく、ここに私の問題があります:backrefを呼び出すのと同じ属性に逆参照したいのですが?このように:
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をbefriends場合ので、関係の役割は同じであり、私はBの友人を呼び出す場合、私はそれででリストを取得する必要があります。これは、完全な形で問題のあるコードです:これはあまりにも多くのテキストがある場合
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
)
申し訳ありませんが、私はこれで私はできる限り明示的になりたいです。私はWeb上でこれに関する参考資料を見つけることができないようです。
これは少し誤りのようです:誤って「all_friends」に追加すると、警告が表示されません。助言がありますか? – Halst
これはまた、(1,2,2のような)交換されたIDと重複する友人関係を可能にします。あるIDが別のIDよりも大きいという制約を置くことができますが、次にどのユーザーがどのユーザーに 'friends'属性を追加できるかを把握する必要があります。 – Halst
viewonly = Trueは、Pythonのコレクションの動作に影響しません。このコレクションへの追加を本当に心配しているのであれば、collection_clsを使用して、NotImplementedErrorまたはそれに類するものを投げるように変更された突然変異メソッドを持つリストまたはセット型を適用できます。 – zzzeek