Я сам переживал это раньше.Мне удалось заставить работать эти самореференциальные отношения:
class Employee(Base):
__tablename__ = 'employee'
id = Column(Integer, primary_key=True)
name = Column(String(64), nullable=False)
Employee.manager_id = Column(Integer, ForeignKey(Employee.id))
Employee.manager = relationship(Employee, backref='subordinates',
remote_side=Employee.id)
Обратите внимание, что manager
и manager_id
"залатаны обезьянами", потому что вы не можете создавать собственные ссылки в определении класса.
Итак, в вашем примере я бы предположил следующее:
class NodeTypeA(BaseNode):
__mapper_args__ = {'polymorphic_identity': 'NodeTypeA'}
typeB_children = relationship('NodeTypeB', backref='parent_node',
remote_side='NodeTypeB.parent_id')
РЕДАКТИРОВАТЬ : В основном ваша ошибка говорит вам о том, что отношение и его обратная ссылка идентичны.Поэтому, какие бы правила SA ни применял для выяснения отношений на уровне таблицы, они не соответствуют информации, которую вы предоставляете.
Я узнал, что простое высказывание mycolumn=relationship(OtherTable)
в вашем декларативном классе приведет кв mycolumn
список, предполагая, что SA может обнаружить однозначную связь.Поэтому, если вы действительно хотите, чтобы объект имел ссылку на своего родителя, а не на своих дочерних элементов, вы можете определить parent=relationship(OtherTable, backref='children', remote_side=OtherTable.id)
в дочерней таблице.Это определяет оба направления отношений родитель-ребенок.