版本:1.1.0b2 |发布日期:2016年7月1日

SQLAlchemy 1.1文档

构造函数和对象初始化

映射不会对该类的构造函数(__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()操作,因此重构器中的活动应保守。