构造函数和对象初始化¶

映射对构造函数没有限制或要求 (__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()操作中,因此重构器中的活动应该是保守的。