我正在使用SQLAlchemy和Flask构建一个Web应用程序。我在两个映射对象之间存在一对多关系。在父对象上,我想有一个子对象的字典(以及collection属性)-这样可以更轻松地与我正在使用的其他Python模块进行接口。
我尝试使用@reconstructor
装饰在加载父对象时调用一个方法,在该方法中,我将使用字典理解来创建新属性。之所以失败,是因为在调用该方法时,该集合尚未完全填充-它仅包含第一项,因为只处理了一行返回的数据。
class Child(Base):
__tablename__ = 'child'
uid = Column(Integer, primary_key=True)
name = Column(String(256))
parent_uid = Column(Integer, ForeignKey('parent.uid'))
parent = relationship('Parent', back_populates='children')
class Parent(Base):
__tablename__ = 'parent'
uid = Column(Integer, primary_key=True)
children = relationship('Child', lazy='joined')
@reconstructor
def init_on_load(self):
self.children_dict = {c.uid : c.name for c in self.children}
我的解决方法是仅在加载对象后立即手动调用init_on_load
,但这非常不明智。我可以绑定任何事件来实现此目的吗?我希望它尽可能早地被调用。在session.query(Parent).filter(Parent.uid == parent_uid).first()
返回值之前。