我使用sqlalchemy
但发现难以搜索的文档。
我是这两列:
verified = Column(Boolean, default=False)
verified_at = Column(DateTime, nullable=True)
我想创建一个像这样的函数:
if self.verified and not oldobj.verified:
self.verified_at = datetime.datetime.utcnow
if not self.verified and oldobj.verified:
self.verified_at = None
我不知道在哪里放这样的代码。我可以把它放在应用程序中,但更希望model
对象处理这个逻辑。
答案 0 :(得分:6)
我认为你要找的是Hybrid Property。
from sqlalchemy.ext.hybrid import hybrid_property
class VerifiedAsset(Base):
id = Column(Integer, primary_key=True)
verified_at = Column('verified_at', String(24))
@hybrid_property
def verification(self):
return self.verified_at;
@verification.setter
def verification(self, value):
if value and not self.verification:
self.verified_at = datetime.datetime.utcnow
if not value and self.verification:
self.verified_at = None
# Presumably you want to handle your other cases here
您希望根据某些传入的新值以特定方式更新verified_at
值。使用属性来包装基础值,并且仅在适当时更新,并且仅对您实际存在于db中的内容进行更新。
答案 1 :(得分:2)
您可以使用sqlalchemy的事件注册来放置代码:http://docs.sqlalchemy.org/en/latest/core/event.html。 基本上,您可以订阅Core和ORM中发生的某些事件。我认为这是管理你想要实现的目标的一种干净方式。
您可以使用listen_for()
装饰器,以便在这些列发生更改时挂钩。
答案 2 :(得分:1)
阅读"Changing Attribute Behavior"和"ORM Events"是尝试解决此类问题的良好开端。
一种方法是设置一个更新时间戳的事件监听器:
@event.listens_for(MyModel.verified, 'set')
def mymodel_verified_set(target, value, oldvalue, initiator):
"""Set verified_at"""
if value != oldvalue:
target.verified_at = datetime.datetime.utcnow() if value else None