Constructors and Object Initialization — SQLAlchemy 2.0.0b1 documentation
Constructors and Object Initialization
Mapping imposes no restrictions or requirements on the constructor (
__init__) method for the class. You are free to require any arguments for the function that you wish, assign attributes to the instance that are unknown to the ORM, and generally do anything else you would normally do when writing a constructor for a Python class.
The SQLAlchemy ORM does not call
__init__ when recreating objects from database rows. The ORM’s process is somewhat akin to the Python standard library’s
pickle module, invoking the low level
__new__ method and then quietly restoring attributes directly on the instance rather than calling
If you need to do some setup on database-loaded instances before they’re ready to use, there is an event hook known as
InstanceEvents.load() which can achieve this; it is also available via a class-specific decorator called
_orm.reconstructor(). When using
_orm.reconstructor(), the mapper will invoke a single decorated method with no arguments every time it loads or reconstructs an instance of the class. This is useful for recreating transient properties that are normally assigned in
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() is executed, the
__init__ constructor is invoked normally and the
data argument is required. When instances are loaded during a
Query operation as in
init_on_load is called.
Any method may be tagged as the
_orm.reconstructor(), even the
__init__ method itself, but only one method may be tagged as such. It is invoked after all immediate column-level attributes are loaded as well as after eagerly-loaded scalar relationships. Eagerly loaded collections may be only partially populated or not populated at all, depending on the kind of eager loading used.
ORM state changes made to objects at this stage will not be recorded for the next flush operation, so the activity within a reconstructor should be conservative.
_orm.reconstructor() is a shortcut into a larger system of “instance level” events, which can be subscribed to using the event API - see
InstanceEvents for the full API description of these events.