构造函数和对象初始化
映射对构造函数没有限制或要求 (__init__
)类的方法。您可以自由地为您想要的函数要求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时做您通常会做的任何其他事情。
sqlAlchemy ORM不调用 __init__
从数据库行重新创建对象时。ORM的过程有点类似于Python标准库的 pickle
模块,调用低级 __new__
方法,然后在实例上悄悄地恢复属性,而不是调用 __init__
.
如果您需要在数据库加载的实例准备好使用之前对其进行一些设置,则有一个称为 InstanceEvents.load()
它可以实现这一点;它也可以通过一个特定于类的修饰器(称为 reconstructor()
。在使用时 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
被称为。
任何方法都可以标记为 reconstructor()
,甚至是 __init__
方法本身,但只有一个方法可以这样标记。它在加载所有直接列级属性之后以及在急切加载的标量关系之后被调用。急切加载的集合可能仅部分填充或根本不填充,这取决于使用的急切加载的类型。
在此阶段对对象所做的ORM状态更改将不会记录到下一次刷新操作中,因此重构器中的活动应该是保守的。
reconstructor()
是“实例级”事件的更大系统的快捷方式,可以使用事件API订阅这些事件-请参阅 InstanceEvents
对于这些事件的完整API描述。
Object Name | Description |
---|---|
reconstructor(fn) | 把一个方法装饰成“重建”挂钩。 |
- function sqlalchemy.orm.reconstructor(fn)¶
把一个方法装饰成“重建”挂钩。
将单个方法指定为“重新构造函数”,则
__init__
-类似的方法,在从数据库加载实例或以其他方式重新构建实例后,ORM将调用该方法。将不带参数调用重构器。实例的标量(非集合)数据库映射属性将可在函数中使用。热切加载的集合通常还不可用,通常只包含第一个元素。在此阶段对对象所做的ORM状态更改将不会记录到下一个flush()操作中,因此重构器中的活动应该是保守的。
参见