【发布时间】:2012-02-10 06:22:54
【问题描述】:
我正在使用带有 SQLAlchemy 的具体表继承。在声明式的模型类中,我已经配置成功了。
我的代码就像:
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))
在 shell 中测试它工作正常:
>>> 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>]
然后我在其他模型中设置关系时遇到了麻烦。每个条目都有一个外键post_id 加入Post 模型,但我无法在Post 中定义反向引用。那行不通:
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")
它引发了一个异常并说:
InvalidRequestError:一个或多个映射器未能初始化 - 无法继续初始化其他映射器。原始异常是:未映射类“models.entry.Entry”。
显然Entry 是一个抽象类,无法映射到真实存在的表。官网的文档有一个例子,但它的基类不是抽象的。现在应该如何设置与抽象模型的多态关系?
【问题讨论】:
标签: python orm sqlalchemy flask-sqlalchemy concrete-inheritance