Estoy utilizando la herencia de tabla concreta con SQLAlchemy. En la clase de modelo de estilo declartivo, lo configuré con éxito.SQLAlchemy Relación polimórfica con la herencia concreta
Mi código al igual que:
class Entry(AbstractConcreteBase, db.Model):
"""Base Class of Entry."""
id = db.Column(db.Integer, primary_key=True, nullable=False)
created = db.Column(db.DateTime, nullable=False)
post_id = declared_attr(lambda c: db.Column(db.ForeignKey("post.id")))
post = declared_attr(lambda c: db.relationship("Post", lazy="joined"))
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
@declared_attr
def __mapper_args__(cls):
# configurate subclasses about concrete table inheritance
return {'polymorphic_identity': cls.__name__,
'concrete': True} if cls.__name__ != "Entry" else {}
class TextEntry(Entry):
"""Text and Article Entry."""
text = db.deferred(db.Column(db.Text, nullable=False))
class PhotoEntry(Entry):
"""Photo Entry."""
path = db.deferred(db.Column(db.String(256), nullable=False))
Funciona bien mientras se prueba entonces en el soporte:
>>> from models.entry import Entry
>>>
>>> Entry.query.all()
[<PhotoEntry 'Title' created by tonyseek>,
<PhotoEntry 'TITLE 2' created by tonyseek>,
<PhotoEntry 'Title 3' created by tonyseek>,
<PhotoEntry 'Title 4' created by tonyseek>,
<TextEntry 'Title' created by tonyseek>]
Entonces caen en problemas al establecer la relación en otros modelos. Cada entrada tiene una clave externa post_id
para unirse al modelo Post
, pero no pude definir la referencia posterior en Post
. Esto no puede funcionar:
class Post(db.Model):
"""An Post."""
id = db.Column(db.Integer, primary_key=True, nullable=False)
description = db.Column(db.Unicode(140), nullable=False)
entries = db.relationship(Entry, lazy="dynamic")
Se lanza una excepción y le dijo:
InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Class 'models.entry.Entry' is not mapped.
Obviamente el Entry
es una clase abstracta, que no pudo ser mapeado a un verdadero existe mesa. El documento en el sitio web oficial tiene un ejemplo, pero su clase base no es abstracta. Ahora, ¿cómo debo hacer para establecer la relación polimórfica con un modelo abstracto?