同时在两个模型中保存对象实例

Posted

技术标签:

【中文标题】同时在两个模型中保存对象实例【英文标题】:save an instance of object in two models simultaneously 【发布时间】:2021-06-07 05:51:36 【问题描述】:

我正在尝试创建一条跟踪产品所有历史的路线。我为product 创建了一个模型,并为producthistory 创建了一个类似的模型。现在,每当我创建一个对象时,我都希望它保存在product 表和producthistory 表中。两个表的唯一区别是 id 字段。 producttable 包含产品的 id,producthistorytable 具有 historytable 的 id 字段以及产品的 id。我想使用产品的 id 进行过滤以进一步使用数据。如何在 producthistory 表中插入产品对象以及当时创建的产品 id?

这里是模型:

class Product(Base):
    __tablename__ = "product"

    id = Column(Integer, primary_key=True, index=True)
    product_url= Column(String)
    current_price= Column(Integer)
    updated_at= Column(String)
    created_at= Column(String)
    target_price= Column(Integer)
    product_name= Column(String)


class ProductHistory(Base):
    __tablename__ = "producthistory"

    id = Column(Integer, primary_key=True, index=True)
    product_id = Column(Integer)
    product_url= Column(String)
    current_price= Column(Integer)
    updated_at= Column(String)
    created_at= Column(String)
    target_price= Column(Integer)
    product_name= Column(String)

这是创建产品的逻辑:

@app.post('/createproducts/')
def createproducts(request: Product, db:Session = Depends(get_db)):
    product = models.Product(
        product_url= request.product_url,
        current_price= request.current_price,
        updated_at= request.updated_at,
        created_at= request.created_at,
        target_price= request.target_price,
        product_name= request.product_name
    )
    db.add(product)
    db.commit()
    db.refresh(product)
    return product

【问题讨论】:

这能回答你的问题吗? Can SQLAlchemy events be used to update a denormalized data cache? 【参考方案1】:

您可以尝试events,它基本上是钩子,在对数据库执行某些操作后执行。据我了解,您需要一个after_insert 钩子:https://docs.sqlalchemy.org/en/13/orm/events.html#sqlalchemy.orm.events.MapperEvents.after_insert

在你的情况下是:

from sqlalchemy import event


@event.listens_for(Product, 'after_insert')
def receive_after_insert(mapper, connection, target):
    # target is the created instance of Product

    # ... create an instance of ProductHistory from target...

【讨论】:

以上是关于同时在两个模型中保存对象实例的主要内容,如果未能解决你的问题,请参考以下文章

对象引用未保存的瞬态实例?

revit不能同时开两个模型吗

Rails中如何通过对象同时保存多个has_many?

Yii2:在具有两个相同模型实例的表单中进行验证

pytorch优化器传入两个模型的参数/保存和加载两个模型的参数

pytorch优化器传入两个模型的参数/保存和加载两个模型的参数