同时在两个模型中保存对象实例
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...
【讨论】:
以上是关于同时在两个模型中保存对象实例的主要内容,如果未能解决你的问题,请参考以下文章