AberSheeran
Aber Sheeran
I know nothing except the fact of my ignorance.

Django模型的信号

起笔自
所属文集: 杂记
共计 810 个字符
落笔于

花了几个小时去看Django模型相关的信号机制,感觉这个信号机制还是很有用的。

  1. pre_init

    django的modal执行其构造方法前,自动触发。在这个时刻,可以从过kwargs['args']获取model的原始数据,此时并不能获取到对象。

  2. post_init

    django的model执行其构造方法后,自动触发。这个时刻,以及在之后的过程里,都可以通过instance获取到对象。

  3. pre_save

    django的model对象保存到数据库前,自动触发

  4. post_save

    django的model对象保存到数据库后,自动触发

  5. pre_delete

    django的model对象从数据库删除前,自动触发

  6. post_delete

    django的model对象从数据库删除后,自动触发

使用样例

比较对象更改

处于某些需求,可能需要监听对象的变化。

@receiver(post_init, sender=Article)
def post_init_article(sender, instance, **kwargs):
    instance._shadow = instance

@receiver(pre_save, sender=Article)
def pre_save_article(sender, instance, **kwargs):
    if instance._shadow.is_show = instance.is_show:
        do.something

在对象刚刚初始化还未投入到任何地方的使用时,我们将此时的对象存一份备份到_shadow,在后续的过程里,可以取出来进行比较以便进行其他操作。

处理对象相关的其他资源

譬如某个模型中含有文件字段,可以利用pre_delete信号去调用清理文件。

一个样例:文件自动同步七牛云

如果你觉得本文值得,不妨赏杯茶
Coding-WebHook
Django-CSRF保护问题