加载集合后的SQLAlchemy实例事件?

时间:2019-05-16 16:09:07

标签: python sqlalchemy

我正在使用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()返回值之前。

0 个答案:

没有答案