Básicamente, tengo este modelo, donde asigné en una sola tabla una clase "BaseNode" y dos subclases. El punto es que necesito una de las subclases, para tener una relación de uno a muchos con la otra subclase. Por lo tanto, en orden, es una relación con otra fila de diferente clase (subclase), pero en la misma tabla. ¿Cómo crees que podría escribirlo usando la sintaxis declarativa ?.SQLAlchemy Relación uno a muchos en herencia de tabla única - declarativo
Nota: debido a otras relaciones en mi modelo, si es posible, realmente necesito seguir con la herencia de una sola tabla.
class BaseNode(DBBase):
__tablename__ = 'base_node'
id = Column(Integer, primary_key=True)
discriminator = Column('type', String(50))
__mapper_args__ = {'polymorphic_on': discriminator}
class NodeTypeA(BaseNode):
__mapper_args__ = {'polymorphic_identity': 'NodeTypeA'}
typeB_children = relationship('NodeTypeB', backref='parent_node')
class NodeTypeB(BaseNode):
__mapper_args__ = {'polymorphic_identity': 'NodeTypeB'}
parent_id = Column(Integer, ForeignKey('base_node.id'))
Utilizando este código tirará:
sqlalchemy.exc.ArgumentError: NodeTypeA.typeB_children and back-reference NodeTypeB.parent_node are both of the same direction . Did you mean to set remote_side on the many-to-one side ?
Cualquier idea o sugerencia?
Gracias por su rápida respuesta !. Lo intenté, pero sigo teniendo el mismo error. ¿Cómo debo cambiar la clase NodeTypeB ?. En su código define Employee.manager_id, y Employee.manager fuera de la definición de clase. Pero en su propuesta a mi código, no lo hizo. Lo siento, creo que no lo entiendo bien. Atentamente. –
Los documentos de SQLAlchemy dicen que está bien proporcionar cadenas que se evalúan para que pueda evitar el error de sintaxis de referencia automática. Pero nunca lo intenté. – wberry
En NodeTypeB su clave externa es para asset_base. Supongo que es un error tipográfico o que te olvidaste de cambiar el nombre antes de publicarlo. Creo que si cambias ForeignKey ('asset_base.id') a ForeignKey (NodeTypeA.id), entonces estará cerca de mi ejemplo de trabajo. – wberry