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`