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