Django 信号

django信号

signals 信号博客资料

Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。 简单来说,信号允许特定的sender通知一组receiver某些操作已经发生。 这在多处代码和同一事件有关联的情况下很有用。

位置: django.db.models.signals

常用:

pre_save **

django.db.models.signals.pre_save

  • 这是在模型的save()方法的开头发送的。

带有此信号的参数:

  • sender

    模型类。
    instance
    正在保存的实际实例。
    raw
    一个布尔值True如果模型按照显示的方式保存(即当加载固定装置时)。 不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。
    using
    正在使用的数据库别名。
    update_fields
    如果有字段被传递给Model.save()方法那么就是所传递的字段集,否则就是None。

    在任意位置写函数绑定即可

    # 导入 信号
    from django.db.models.signals import pre_save
    
    def my_callback(sender, **kwargs):
        print(sender)  # 激活函数的 model
        print(kwargs)
        print("要保存了啊!")
        print('-' * 120)
        
    # 绑定信号
    pre_save.connect(my_callback)
    
    

post_save **

django.db.models.signals.post_save

  • 像pre_save一样,但是在save()方法的末尾发送。

带有此信号的参数:

  • sender

    模型类。
    instance
    正在保存的实际实例。
    created
    一个布尔值True如果创建了新记录。
    raw
    一个布尔值True如果模型按照显示的方式保存(即当加载固定装置时)。 不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。
    using
    正在使用的数据库别名。
    update_fields
    如果有字段被传递给Model.save()方法那么就是所传递的字段集,否则就是None。

pre_delete

django.db.models.signals.pre_delete

  • 在模型的delete()方法和queryset的delete()方法的开头发送。

带有此信号的参数:

  • sender

    模型类。
    instance
    正在删除的实际实例。
    using
    正在使用的数据库别名。

post_delete

django.db.models.signals.post_delete

  • 像pre_delete一样,但是在模型的delete()方法和queryset的delete()方法的末尾发送。

带有此信号的参数:

  • sender

    模型类。
    instance
    正在删除的实际实例。

    请注意,该对象将不再位于数据库中,所以要非常小心使用此实例。

    using
    正在使用的数据库别名。

使用装饰器方法:

from django.dispatch import receiver

# 使用装饰器方式
from django.db.models.signals import pre_save
from django.dispatch import receiver


@receiver(pre_save, sender="xxx") # sender 发送者
def my_callback(sender, **kwargs):
    print(sender)
    print(kwargs)
    print("要保存了啊!")
    print('-' * 120)
posted @ 2019-05-01 18:41  拐弯  阅读(140)  评论(0编辑  收藏  举报