Python SQLAlchemy:基于其他属性初始化属性

Python SQLAlchemy:基于其他属性初始化属性,python,orm,sqlalchemy,Python,Orm,Sqlalchemy,我正在使用SQLAlchemy进行一个Python项目。我有以下课程(我省略了一些与问题无关的方法): 如您所见,在初始化类实例时,属性cmd\u name是使用event\u names列表从cmd\u id属性创建的(也省略了,它是一个包含命令名的简单列表) 我创建对象Cmd,添加它会话,提交会话。关闭应用程序并再次启动后,我尝试使用SQLAlchemy查询加载此Cmd。对象已加载,但当然不会调用\uuuu init\uuu,也不会设置cmd\u name 我想知道在通过查询获取cmd对象后

我正在使用SQLAlchemy进行一个Python项目。我有以下课程(我省略了一些与问题无关的方法):

如您所见,在初始化类实例时,属性
cmd\u name
是使用
event\u names
列表从
cmd\u id
属性创建的(也省略了,它是一个包含命令名的简单列表)

我创建对象
Cmd
,添加它会话,提交会话。关闭应用程序并再次启动后,我尝试使用SQLAlchemy查询加载此
Cmd
。对象已加载,但当然不会调用
\uuuu init\uuu
,也不会设置
cmd\u name

我想知道在通过查询获取
cmd
对象后,是否有一些简单的方法来执行某些代码(
self.cmd\u name=event\u names[self.cmd\u id]
)。当然,我可以做一个特殊的方法,并总是在查询后启动它,但我正在寻找更优雅、自动的方法


我已经阅读了文档并找到了一些关于ORM事件侦听器的信息,但是对于这种简单的情况来说,这些信息似乎太多了。我还找到了一篇关于属性事件的文章,但它们只与
column\u属性
关系
一起工作。有什么简单、优雅的方法可以实现我想要的吗?

您可以使用@reconstructor decorator:

from sqlalchemy.orm import reconstructor
class Cmd(Base):
    __tablename__ = "commands"
    dbid = Column(Integer, Sequence("commands_seq"), primary_key = True)
    cmd_id = Column(SmallInteger)
    instance_dbid =  Column(Integer, ForeignKey("instances.dbid"))
    type = Column(String(20))

    __mapper_args__ = {
    "polymorphic_on" : type,
    "polymorphic_identity" : "Cmd"
    }

    def __init__(self, cmd_id):
        self.cmd_id = cmd_id
        self.cmd_name = event_names[self.cmd_id]

    @reconstructor
    def init_db_load(self):
        self.cmd_name = event_names[self.cmd_id]

请参见“构造函数和对象初始化”下的内容。

我知道必须有比映射器事件侦听器更简单的东西:)
from sqlalchemy.orm import reconstructor
class Cmd(Base):
    __tablename__ = "commands"
    dbid = Column(Integer, Sequence("commands_seq"), primary_key = True)
    cmd_id = Column(SmallInteger)
    instance_dbid =  Column(Integer, ForeignKey("instances.dbid"))
    type = Column(String(20))

    __mapper_args__ = {
    "polymorphic_on" : type,
    "polymorphic_identity" : "Cmd"
    }

    def __init__(self, cmd_id):
        self.cmd_id = cmd_id
        self.cmd_name = event_names[self.cmd_id]

    @reconstructor
    def init_db_load(self):
        self.cmd_name = event_names[self.cmd_id]