Peewee ORM 中的 before_save() 和 after_save() 挂钩?
before_save() and after_save() hooks in Peewee ORM?
我正在使用 Peewee ORM in my Flask website and I now want to build a versioned/history table so that I can track changes to records. I'm following the basic SQL structure from this SO answer。
所以要做到这一点,我需要一些方法来为字段的 .save() 方法插入触发器,我想我曾经读过某种 before_save 和 after_save 钩子,但是我再也找不到类似的东西了。
那么有人知道我如何连接额外的方法来保存、更新和删除记录,以及在 Peewee ORM 中创建表吗?
欢迎所有提示!
它作为 signals
扩展的一部分包含在内:
http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#signal-support
这里是 playhouse.signals.pre_save
的一个例子。假设所有 Model
类 继承自 BaseModel
,这会为每个 table.
添加时间戳
import datetime as dt
from playhouse.signals import Model, pre_save
from peewee import DateTimeField
def timezone_now():
"""Infers timezone from user's OS. It knows EDT vs EST."""
return dt.datetime.now(dt.timezone.utc).astimezone()
class BaseModel(Model):
time_created = DateTimeField()
time_updated = DateTimeField()
class Meta:
database = get_db()
# Fetch as human-readable timestamps
def created_at(self):
return self.time_created.strftime('%Y%b%d_%H:%M:%S')
def updated_at(self):
return self.time_updated.strftime('%Y%b%d_%H:%M:%S')
@pre_save(sender=BaseModel)
def add_timestamps(model_class, instance, created):
if (created==True):
instance.time_created = timezone_now()
instance.time_updated = timezone_now()
# intentionally no `return`
我正在使用 Peewee ORM in my Flask website and I now want to build a versioned/history table so that I can track changes to records. I'm following the basic SQL structure from this SO answer。
所以要做到这一点,我需要一些方法来为字段的 .save() 方法插入触发器,我想我曾经读过某种 before_save 和 after_save 钩子,但是我再也找不到类似的东西了。
那么有人知道我如何连接额外的方法来保存、更新和删除记录,以及在 Peewee ORM 中创建表吗?
欢迎所有提示!
它作为 signals
扩展的一部分包含在内:
http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#signal-support
这里是 playhouse.signals.pre_save
的一个例子。假设所有 Model
类 继承自 BaseModel
,这会为每个 table.
import datetime as dt
from playhouse.signals import Model, pre_save
from peewee import DateTimeField
def timezone_now():
"""Infers timezone from user's OS. It knows EDT vs EST."""
return dt.datetime.now(dt.timezone.utc).astimezone()
class BaseModel(Model):
time_created = DateTimeField()
time_updated = DateTimeField()
class Meta:
database = get_db()
# Fetch as human-readable timestamps
def created_at(self):
return self.time_created.strftime('%Y%b%d_%H:%M:%S')
def updated_at(self):
return self.time_updated.strftime('%Y%b%d_%H:%M:%S')
@pre_save(sender=BaseModel)
def add_timestamps(model_class, instance, created):
if (created==True):
instance.time_created = timezone_now()
instance.time_updated = timezone_now()
# intentionally no `return`