[英]onupdate based on another field with sqlalchemy declarative base
[英]Overwrite postgresql onupdate with sqlalchemy
我在我们的项目中使用sqlalchemy 的原始问题。 我像这样为我的模型注册了几个事件监听器。
@event.listens_for(Post, 'after_update')
@event.listens_for(Post, 'after_insert')
在代码的其他地方,我更新了模型的view_counter
属性。
post.view_counter += 1
DBSession.flush()
现在,由于view_counter
不是我认为的内容更新,我想在after_update
中为这个特定更新抑制after_update
事件的触发。 有没有办法通过 ORM 来做到这一点,或者是完全绕过 ORM 进行原始 SQL 更新的唯一方法?
编辑经过一番摸索,我意识到还有另一个问题,该属性是由Postgresql
本身设置的
date_last_updated = Column(SA_DateTime, default=DateTime.now, onupdate=DateTime.now, nullable=False, index=True)
问题
所以问题是,如何在不触发 Postgresql 更新的情况下更新 sqlalchemy 模型。
如果您能够对装饰函数进行更改,则应该可以使用传递的参数来确定修改了哪些字段,尽管需要一些解决方法。 恐怕我还没有能够测试这个,但我希望它有帮助!
@event.listens_for(Post, 'after_update', raw=True)
@event.listens_for(Post, 'after_insert', raw=True)
def myfunc(mapper, connection, target):
# Values have been modified
if target.session.is_modified(target, include_collections=False):
# view_counter is the only modified value, the hook can be aborted
if set(target.dict.keys()) - target.unmodified == {'view_counter'}:
return
<...the rest of the function...>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.