Django模型的信号

创建于 访问量:

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

  1. pre_init

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

  2. post_init

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

  3. pre_save

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

  4. post_save

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

  5. pre_delete

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

  6. post_delete

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

使用样例

比较对象更改

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

@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,在后续的过程里,可以取出来进行比较以便进行其他操作。

即时清理存储

对于我这种贫穷的开发者而言,储存空间十分宝贵,一些已经删除掉的Image对象,就不需要在本地存对应的图片了。这时候就可以请出删除信号上场。

@receiver(pre_delete, sender=Image)
def del_image(sender, instance, **kwargs):
    if str(instance.file):
        image = os.path.join(settings.MEDIA_ROOT, str(instance.file))
        if os.path.exists(image):
            os.remove(image)

即时清除缓存

很多时候,我们都会将一些长期不变的东西进行缓存。但往往无法把握缓存应该存在的时长,长了,测试人员会告诉你这个有Bug,更新不及时。短了,缓存又跟不存在一样。

那么可以考虑结合模型的信号机制,在模型出现更改之后由系统主动清除缓存,缓存时长设置永久或者很长的一段时间,以此做到即时更新与高效缓存。