钩子函数
pony中有6个钩子函数,可以在对应的时间发生时被触发.最类似的行为就是数据库中的触发器
- after_delete 在数据库中删除实体实例后调用。
- after_insert 在将行插入数据库后调用。
- after_update 在数据库中更新实例后调用。
- before_delete 在删除数据库中的实体实例之前调用。
- before_insert 在将新创建的对象插入数据库之前,仅对其调用。
- before_update 在更新数据库中的实例之前调用实体实例。
下面以实例演示一下:
有2个类Solider(战士)和Gun(枪).逻辑是这样的:
- 每招募一名战士,就给他发一杆枪
- 每支枪发下去的时候,会在铭牌上刻上“xxx的xx武器”的字样
我们打算使用2个钩子函数来完成这个功能
- 在初始化Solider实例之后(保存之前),Solider实例是否有gun属性,如果没有,创建一个。
- 在Solider实例保存之后,修改Solider实例对应的Gun实例的sign属性(刻字)
class Solider(db.Entity):
"""士兵"""
name = Required(str, max_len=40) # 名字
gun = Optional("Gun", column="gun_id", nullable=True, default=None) # 武器
@classmethod
@db_session
def create(cls, **kwargs) -> db.Entity:
instance = cls(**kwargs)
return instance
@db_session
def before_insert(self):
"""
:return:
"""
if self.gun is None:
gun = Gun()
gun.flush()
self.gun = gun
@db_session
def after_insert(self):
"""
:return:
"""
self.gun.sign = "{}的{}".format(self.name, self.