SQLAlchemy декларативный много-много само-соединиться через объект ассоциации

У меня есть таблица "Пользователи" и таблица "Друзья", которая сопоставляет пользователей с другими пользователями, так как каждый пользователь может иметь много друзей. Это отношение очевидно симметрично: если пользователь A является другом пользователя B, то пользователь B также является другом пользователя A, я сохраняю это отношение только один раз. В таблице "Друзья" помимо двух идентификаторов пользователей есть дополнительные поля, поэтому я должен использовать объект ассоциации.

Я пытаюсь определить это отношение в декларативном стиле в классе Users (который расширяет декларативную базу), но, кажется, не могу понять, как это сделать. Я хочу иметь доступ ко всем друзьям данного пользователя через свойство "друзья", скажем, "друзья" = bob.friends.

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

EDIT: Моя последняя попытка выглядит так:

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

    # Relationships
    friends1 = relationship('Friends', primaryjoin=lambda: id==Friends.friend1ID)
    friends2 = relationship('Friends', primaryjoin=lambda: id==Friends.friend2ID)


class Friends(Base):
    __tablename__ = 'friends'
    id = Column(Integer, primary_key=True)
    friend1ID = Column(Integer, ForeignKey('users.id') )
    friend2ID = Column(Integer, ForeignKey('users.id') )
    status = Column(Integer)

    # Relationships
    vriend1 = relationship('Student', primaryjoin=student2ID==Student.id)
    vriend2 = relationship('Student', primaryjoin=student1ID==Student.id)

Это, однако, приводит к следующей ошибке:

InvalidRequestError: Table 'users' is already defined for this MetaData instance.  Specify 'extend_existing=True' to redefine options and columns on an existing Table object.

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

10
задан Ilja Everilä 5 February 2018 в 07:04
поделиться