映射对构造函数没有限制或要求 (__init__
)类的方法。您可以自由地为您想要的函数要求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时做您通常会做的任何其他事情。
sqlAlchemy ORM不调用 __init__
从数据库行重新创建对象时。ORM的过程有点类似于Python标准库的 pickle
模块,调用低级 __new__
方法,然后在实例上悄悄地恢复属性,而不是调用 __init__
.
如果需要在数据库加载的实例准备好使用之前对其进行一些设置,则存在一个事件挂钩,称为 InstanceEvents.load()
这可以实现;它也可以通过一个特定于类的修饰符调用 orm.reconstructor()
. 使用时 orm.reconstructor()
每次加载或重建类的实例时,映射器都将调用不带参数的修饰方法。这对于重新创建通常在 __init__
::
from sqlalchemy import orm
class MyMappedClass(object):
def __init__(self, data):
self.data = data
# we need stuff on all instances, but not in the database.
self.stuff = []
@orm.reconstructor
def init_on_load(self):
self.stuff = []
以上,何时 obj = MyMappedClass()
被执行, __init__
通常调用构造函数, data
参数是必需的。当实例在 Query
操作如 query(MyMappedClass).one()
, init_on_load
被称为。
任何方法都可以标记为 orm.reconstructor()
,甚至 __init__
方法本身。它在加载所有立即列级属性之后以及在急切加载标量关系之后调用。热切装载的集合可能只是部分填充,或者根本不填充,这取决于所使用的热切装载的类型。
在此阶段对对象所做的ORM状态更改将不会记录到下一次刷新操作中,因此重构器中的活动应该是保守的。
orm.reconstructor()
是“实例级”事件的更大系统的快捷方式,可以使用事件API订阅这些事件-请参阅 InstanceEvents
对于这些事件的完整API描述。
sqlalchemy.orm.
reconstructor
(fn)¶把一个方法装饰成“重建”挂钩。
将一个方法指定为“重构器”,即 __init__
-与ORM在从数据库加载实例或以其他方式重新构建实例后调用的方法类似。
将不带参数调用重构器。实例的标量(非集合)数据库映射属性将可在函数中使用。热切加载的集合通常还不可用,通常只包含第一个元素。在此阶段对对象所做的ORM状态更改将不会记录到下一个flush()操作中,因此重构器中的活动应该是保守的。