0

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

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]

如您所见,在初始化类的实例时,属性是使用列表cmd_name从属性创建的(也省略了,它是一个包含命令名称的简单列表)。cmd_idevent_names

我创建对象Cmd,添加它会话,提交会话。关闭应用程序并再次启动后,我尝试Cmd使用 SQLAlchemy 查询加载它。该对象被加载,但当然__init__没有被调用,cmd_name也没有被设置。

我想知道在通过查询self.cmd_name = event_names[self.cmd_id]获取Cmd对象后是否有一些简单的方法可以执行一些代码()。当然我可以做一个特殊的方法,总是在查询后启动它,但我正在寻求更优雅、更自动的方式。

我已经阅读了文档并找到了一些有关 ORM 事件侦听器的信息,但对于这种简单的情况来说,它们似乎太多了。我还找到了有关属性事件的文章,但它们只能与它们一起column_property使用relationship。是否有任何简短而优雅的方式来实现我想要的?

4

1 回答 1

1

您可以使用 @reconstructor 装饰器:

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]

请参阅“构造函数和对象初始化”下的此文档。

于 2013-07-03T17:47:13.557 回答