如何在SqlAlchemy中创建对象时绑定事件?

时间:2013-11-22 09:32:18

标签: python sqlalchemy flask-sqlalchemy

我有两张表AB。 在表B中创建新行后,我需要在表ForeignKey中创建一行(带A引用)。

例如:

class A(db.Model):
    __tablename__ = 'a'

    id = Column(BigInteger, primary_key=True)
    ...

class B(db.Model):
    __tablename__ = 'b'

    id = Column(BigInteger, primary_key=True)
    a_id = Column(BigInteger, ForeignKey('a.id'), nullable=False, index=True)
    ...

SA中此案例的最佳解决方案是什么?

我听说过事件,但在这种情况下无法理解如何使用它们。

1 个答案:

答案 0 :(得分:1)

示例事件:

def update_slug(mapper, connection, target):
    target.slug = slugify(target.name)
    if target.name_en:
        target.slug_en = slugify(target.name_en)

event.listen(Post, 'before_insert', update_slug_with_date)
event.listen(Post, 'before_update', update_slug_with_date)

您只需定义一个功能。你需要将它标记为一个事件(最后两行),在你的情况下它将是'after_insert'并且可能在A模型上'更新'之后。 在函数中,您可以执行以下操作:

b = B()
b.a = target
b.save()

target这里是引发事件的实例。

从评论中编辑标记正确的答案:根据文档,您无法在事件中但在SessionEvents.after_flush中执行此操作。您应该查看文档:{​​{3}}