Как я могу получить самосвязывающиеся отношения «многие ко многим» в SQLAlchemy ORM с обратной ссылкой на один и тот же атрибут?

Я пытаюсь реализовать самореферентное отношение «многие ко многим» с использованием декларативного в SQLAlchemy.

Отношения представляют собой дружбу между двумя пользователями. В Интернете я узнал (как в документации, так и в Google), как создать самореферентные отношения m2m, где роли как-то различаются. Это означает, что в этих отношениях m2m UserA является, например, боссом UserB, поэтому он перечисляет его под атрибутом «подчиненные» или что у вас есть. Точно так же UserB перечисляет UserA под «начальством».

Это не составляет проблемы, потому что мы можем объявить обратную ссылку на ту же таблицу следующим образом:

subordinates = relationship('User', backref='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=??????
                       )

Это имеет смысл, потому что, если A дружит с B, роли в отношениях одинаковы, и если я вызываю друзей B, я должен получить список с буквой A. Это проблемный код в полном объеме:

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
                           )

Извините, если это слишком много текста, я просто хочу быть как можно более явным с этим. Я не могу найти какой-либо справочный материал по этому вопросу в Интернете.

Ответы на вопрос(2)

Ваш ответ на вопрос