Python SQLAlchemy:基于其他属性初始化属性
我正在使用SQLAlchemy进行一个Python项目。我有以下课程(我省略了一些与问题无关的方法): 如您所见,在初始化类实例时,属性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对象后
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]