Я пытаюсь реализовать самореферентное отношение «многие ко многим», используя декларативное в SQLAlchemy.
Отношения представляют собой дружбу между двумя пользователями. В Интернете я узнал (как в документации, так и в Google), как создать самореферентные отношения m2m, где роли как-то различаются. Это означает, что в этих отношениях m2m UserA является, например, боссом UserB, поэтому он перечисляет его под атрибутом «подчиненные» или что у вас есть. Точно так же UserB перечисляет UserA под «начальством».
Это не составляет проблемы, потому что мы можем объявить обратную ссылку на ту же таблицу следующим образом:
subordinates = relationship('User', backref='superiors')
Так что, конечно, атрибут 'superiors' не является явным внутри класса.
В любом случае, вот моя проблема: что, если я захочу сделать возврат к тому же атрибуту, где я вызываю обратный вызов? Как это:
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=??????
)
Это имеет смысл, потому что, если А дружит с Б, роли в отношениях одинаковы, и если я вызову друзей Б, я должен получить список с А в нем. Это проблемный код в полном объеме:
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
)
Извините, если это слишком много текста, я просто хочу быть как можно более явным с этим. Кажется, я не могу найти в Интернете никаких справочных материалов по этому вопросу.