信号

lightning 提供了四个signal,主要是对Model的增删改操作前后发出,开发者可以在pre_*类的signal响应中做一些前置校验性的逻辑,开post_*类的signal中做一些补充的逻辑。

这几个signal和 Django的 pre_savepost_savepre_deletepre_delete类似,需要根据开发者自己的场景来决定使用哪个signal,如果是想对lightning管理后台及lightning api对数据的增删改进行扩展,可以使用lightning的signal,如果面向其他更多的操作途径,可以考虑使用Django内置的signal。

signal代码建议写在应用目录的signals.py文件中或其他会被自动加载的源码文件中如admin.py, mode.py。

示例:

from lightning.signals import pre_lightning_create, pre_lightning_delete
from django.dispatch import receiver
from lightning_crm.models import Customer
@receiver(pre_lightning_create, sender=Customer)
def check_before_create(sender, instance, create, **kwargs):
print('do something before save Customer object')
@receiver(pre_lightning_delete, sender=Customer)
def check_before_delete(sender, instance, **kwargs):
print('do something before delete Customer object')

pre_lightning_create#

model实例保存前发出该signal,处理函数需要接受以下参数:

  • sender, 信号发送者,即Model
  • instance, 待保存的数据,格式为dict,外键及多对多的属性己预加载为django数据对象。该数据仅用于进一步校验,不能做修改,以免造成未知问題。
  • create, 是否创建操作,False时为更新操作。
  • request, 当前的Django请求
  • old_instance, 当create为False,即更新时,会提供旧对象

post_lightning_create#

model实例保存后发出该signal,处理函数需要接受以下参数:

  • sender, 信号发送者,即Model
  • instance,已保存的Model实例,此时可以对该实例进行二次操作及保存等。如果使用django的 post_save,在处理函数中作二次保存,会导致无限循环,使用lightning的signal则没有问題。
  • create, 是否创建操作,False时为更新操作。
  • request, 当前的Django请求。
  • old_instance, 当create为False,即更新时,会提供旧对象

请注意,如果处理函数发生了异常没有捕捉,会导致当前数据库的操作回滚,所以,请开发者根据自己的使用场景决定是否需要进行异常捕捉。

pre_lightning_delete#

model实例被删除前发出该信号,信号处理函数可进行前置校验或阻止删除(抛出异常即可),函数接受以下参数:

  • sender, 信号发送者,即Model
  • instance, 将要被删除的model实例副本,仅供前端校验用,不要对该instace做保存或修改操作,否则会出现数据重复或其他未知错误。
  • request, 当前的Django请求。

post_lightning_delete#

model实例被删除后发出该信号,信号处理函数可进行后续的清理工作,函数接受以下参数:

  • sender, 信号发送者,即Model
  • instance, 已被删除的model实例副本,仅供前端校验用,不要对该instace做保存或修改操作,否则会出现数据重复或其他未知错误。
  • request, 当前的Django请求。

注意事项#

  1. 以上siangl均在单条数据的增删改操作时有效,批量操作时不会触发。
  2. 请注意,如果处理函数发生了异常没有捕捉,会导致当前数据库的操作回滚,所以,请开发者根据自己的使用场景决定是否需要进行异常捕捉。