假设我有这样的事情:
def Tab(Base):
a = 'a'
b = 'b'
c = 'c'
def __init__(self):
self.c_a = DBSession.query(Table2).filter(Table2.a == self.a).all()
似乎self.c_a
仅适用于我插入的项目。我想确保__init__
中指定的操作(这只是一个可能通过relationship()
更好地完成的示例,但使用您的想象力)适用于所有对象,包括SA查询出来的对象数据库。有谁知道怎么做?
我觉得我可能会误解某些东西,如果是这样,请纠正我。
答案 0 :(得分:5)
另请查看有关@reconstructor
:http://www.sqlalchemy.org/docs/orm/mapper_config.html#constructors-and-object-initialization
答案 1 :(得分:5)
从模型内部引用数据库是一个抽象泄漏;模型不应该知道它们可能存在的持久性的细节;它们可能根本不存在(它们毕竟是模型,可能用于任何类型的计算。)
尝试与其他实体建立关联时,应始终使用relationship()
,无论是否存在基础持久性存储,它都可以正常工作。更重要的是,当您使用SQLAlchemy进行动态生成的查询时,关系非常有用;在模型方法中执行查询不允许这种灵活性。
如果您确定需要在模型层(而不是通常应该是控制器层)上进行会话,那么您当然不应使用全局会话实例;总是从对象本身计算会话:
class MyModel(Base):
def frobnicate(self):
session = sqlalchemy.orm.Session.object_session(self)
if session is None:
raise ValueError("not connected to a session")
session.query(...)
答案 2 :(得分:1)
您是对的,当使用SA会话加载对象时,不会调用__init__
要在其他情况下执行代码,请使用Instance Events。我想load
在你的情况下特别有用,但refresh
也可能有用。