У меня есть таблица «Пользователи» и таблица «Друзья», которая сопоставляет пользователей с другими пользователями, поскольку у каждого пользователя может быть много друзей. Это отношение, очевидно, симметрично: если пользователь A является другом пользователя B, то пользователь B также является другом пользователя A, я сохраняю это отношение только один раз. В таблице друзей есть дополнительные поля, помимо двух идентификаторов пользователя, поэтому мне приходится использовать объект ассоциации.
Я пытаюсь определить эту связь в декларативном стиле в классе Users (который расширяет декларативную базу), но я не могу понять, как это сделать. Я хочу иметь доступ ко всем друзьям данного пользователя через друзья свойства, так сказать, друзья = bob.friends.
Каков наилучший подход к этой проблеме? Я пробовал много разных настроек, чтобы опубликовать здесь, и ни одна из них не работала по разным причинам.
РЕДАКТИРОВАТЬ: Моя последняя попытка выглядит так:
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.
Я должен признать, что на данный момент я совершенно сбит с толку из-за множества неудачных попыток и, возможно, сделал не одну глупую ошибку в вышеизложенном.
directional
. - person van   schedule 05.09.2011