我怎样才能监听一个特定模型的创建,并在此基础上创建一个新的模型(在一个不同的表上)?[英] How can I listen for the creation of a specific model and create a new one (on a different table) based on this?

本文是小编为大家收集整理的关于我怎样才能监听一个特定模型的创建,并在此基础上创建一个新的模型(在一个不同的表上)?的处理方法,想解了我怎样才能监听一个特定模型的创建,并在此基础上创建一个新的模型(在一个不同的表上)?的问题怎么解决?我怎样才能监听一个特定模型的创建,并在此基础上创建一个新的模型(在一个不同的表上)?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个带有 referral_key 属性的 User 模型.我想在创建用户时创建一个 ReferralKeyRecord .我已经阅读了大量文档和 StackExchange 无济于事.

这个 答案使用 after_insert(),但我不想更改或验证正在插入的类;我正在尝试从完全不同的模型中添加一个新对象,但不支持 session.add().

这个答案更接近我想要什么,但接受的答案(最终)使用 after_flush(),这太笼统了.我不想听每当数据库以某种方式更新时引发的事件.我希望它在创建 特定 模型时触发.

还有类似下面的...

@event.listens_for(User, 'after_flush')
def create_referral_record(mapper, connection, target):
    session.add(ReferralRecord(key=instances.referral_key))
    session.commit()

... 结果为 No such event 'after_flush' for target '<class 'models.User'>.我查看了 SQLAlchemy 的文档(核心事件和 ORM 事件),没有看到任何表明已创建特定模型的事件.Mapper 事件中最接近的是 after_insert 方法,Session 事件中最接近的是 after_flush() 方法.我想这是一件很常见的事情,如果没有一个简单的事件可以听,我会感到惊讶.我认为它会是这样的:

@event.listens_for(User, 'on_creation')
def create_referral_record(session, instance):
    record = ReferralRecord(key=instance.referral_key)
    session.add(record)
    session.commit()

有人比我更了解吗?

推荐答案

或者为什么不在User构造函数中创建Referral?

from sqlalchemy.orm import Session, relationship, Mapper
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, ForeignKey, create_engine, event


Base = declarative_base()


class User(Base):
    __tablename__ = 'user'

    def __init__(self):
        self.referral = Referral()

    id = Column(Integer(), primary_key=True)    
    referral = relationship('Referral', uselist=False)


class Referral(Base):
    __tablename__ = 'referral'
    id = Column(Integer(), primary_key=True)
    user_id = Column(Integer(), ForeignKey('user.id'), nullable=False)


engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
session = Session(bind=engine)

session.add(User())
session.commit()

print(session.query(User).all())
print(session.query(Referral).all())

本文地址:https://www.itbaoku.cn/post/1764200.html