У меня есть таблица "Пользователи" и таблица "Друзья", которая сопоставляет пользователей с другими пользователями, так как каждый пользователь может иметь много друзей. Это отношение очевидно симметрично: если пользователь 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.
Должен признать, что на данный момент я полностью запутался из-за многих неудачных попыток и, возможно, допустил более одной глупой ошибки.