企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 信号 信号这东西实际上也接触非常久了,粗略的来说,信号就是一个更高层级的SQL触发器,只是它能管理的事件更多更复杂,不是SQL的那种简单insert或者delete触发器所能比较的,但总的来说它们的作用可以概括成一句话:**在某个行为进行的某个阶段给这个行为添加一个附带的行为** ### 应用 首先需要明确的是:**django的信号不止可以用在数据模型的数据库增删查改行为中**,虽然这是它最重要的作用之一 引用源为django.db.models.signals,最主要的两类信号是关于数据模型和请求的 举一些栗子 ~~~py pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_delete # django的modal对象删除前,自动触发 post_delete # django的modal对象删除后,自动触发 m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发 class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发 ~~~ <br> 实际应用中,我们需要自己写接收器函数,也就是具体在上面这些行为发生时我们究竟还要额外的对发出信号的对象做些什么 ~~~py from django.db.models.signals import pre_save from django.dispatch import receiver @receiver(pre_save) def do_something(sender, **kwargs): print "I'm doing it now!" ~~~ 上面这个简单的栗子已经足以说明信号的作用,通过receiver装饰器我们将do_something函数添加到了sender对象在保存之前必须做的事情的清单里面,也就是说任何一个sender对象在被保存进数据库之前肯定会在后台打印一句"I'm doing it now!" 可能这里对sender具体指的谁不是很明确,这里明确强调下,**如果receiver装饰器中没有额外对sender参数进行声明,sender代表当前app下的所有数据模型** 既然说了receiver中也可以指定参数,那就是说信号也是可以针对某些具体的数据模型进行信号接受的 ~~~py from django.db.models.signals import pre_save from django.dispatch import receiver from myapp.models import MyModel @receiver(pre_save, sender=MyModel) def my_handler(sender, **kwargs): ... ~~~ 上面这种情况就是说虽然当前app的每一个数据模型都会针对pre_save情况发出信号,但是只有MyModel这个模型发出的信号会被receiver接收并运行my_handler中的逻辑 另外信号还有一种不那么PythonIC的写法,以上面的情况为例 ~~~py from django.db.models.signals import pre_save pre_save.connect(my_handler) ~~~ 起到的效果是一样的