映射不会对该类的构造函数(__init__
)方法施加任何限制或要求。您可以自由地为您希望的函数请求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时执行通常要做的任何其他操作。
当从数据库行重新创建对象时,SQLAlchemy ORM不会调用__init__
。ORM的过程有点类似于Python标准库的pickle
模块,调用低级别的__new__
方法,然后直接在实例上静静地恢复属性,而不是调用__init__
如果您需要在数据库加载的实例准备就绪之前对其进行设置,那么可以使用@reconstructor
修饰器将方法标记为__init__
每次加载或重建实例时,SQLAlchemy都会在没有参数的情况下调用此方法。这对于重新创建通常在__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()
时,Python将__init__
normal和data
参数是必需的。当像query(MyMappedClass).one()
那样在Query
操作期间加载实例时,会调用init_on_load
。
任何方法都可以标记为reconstructor()
,甚至可以标记为__init__
方法。SQLAlchemy将调用没有参数的重构器方法。该实例的标量(非集合)数据库映射属性将可用于该函数中。急切加载的集合通常还不可用,通常只包含第一个元素。在此阶段对对象所做的ORM状态更改将不会记录下一次flush()操作,因此重构器中的活动应保守。
reconstructor()
是一个更大的“实例级”事件系统的快捷方式,可以使用事件API进行订阅 - 请参阅InstanceEvents
事件。
sqlalchemy.orm。 T0> 重建 T1> ( T2> FN T3> ) T4> ¶ T5 >
装饰方法作为'重建'钩子。
Designates a method as the “reconstructor”, an __init__
-like method that will be called by the ORM after the instance has been loaded from the database or otherwise reconstituted.
重构器将被调用,不带任何参数。该实例的标量(非集合)数据库映射属性将可用于该函数中。急切加载的集合通常还不可用,通常只包含第一个元素。在此阶段对对象所做的ORM状态更改将不会记录下一次flush()操作,因此重构器中的活动应保守。