Django 信号 — 初学者

Django 信号 — 初学者

Django Signals 101

如果使用得当,Django 中的信号非常有用。信号由发送者和接收者两个主要元素组成。 Sender 负责发送信号(事件)。接收器(函数)接收执行的信号。

Sender 是一个 python 对象,或者说是那个实例的模型对象。

Receiver 是一个函数,它与模型对象或 sender 相关。每当模型实例或类发生一些变化时,就会相应地创建一个信号。

Django 中的信号可以是 pre_init、post_init、pre_migrate、post_migrate、pre_save、post_save、post_delete、pre_delete、m2m_change。顾名思义,只要 db 发生某种变化,这都是 db 模型信号,我们可以相应地发送这些信号。

让我们通过一些例子来谈谈一些常用的信号。

最常见的示例假设您有一个用户和个人资料模型,并且每个用户将始终拥有个人资料,然后我们可以使用信号处理此事件。

 模型.py 从 django.db 导入模型  
 从 django.contrib.auth.models 导入用户 类配置文件(模型。模型):  
 用户 = models.OneToOneField(用户,on_delete=models.CASCADE)  
 name = models.CharField(max_length=100, null=True, blank=True)

在你的 app 文件夹中创建一个 signals.py 文件并在那里创建你的信号。

 信号.py 从 django.db.models.signals 导入 post_save  
 从 django.dispatch 导入接收器 从 django.contrib.auth.models 导入用户 从 .models 导入配置文件 @receiver(post_save,发件人=用户)  
 def create_user_profile(sender, instance, created, **kwargs):  
 Profile.objects.create(用户=实例)

我们可以看到我们在 create_user_profile 中有一个接收器(装饰器)函数,它有发送者、实例和创建的参数。现在,这些 args 可以根据 pre_save 没有为其创建 args 之类的信号而变化。现在 sender 携带生成信号的模型类,即本例中的用户。我们可以通过多种方式使用此发送方参数。例如:

 sender_object = sender.objects.all() 或  
 发件人对象 =  
 如果 sender.objects.filter(name="medium").exists() 则为真,否则为假

我们可以通过在信号中使用 sender 来执行我们可以使用模型类执行的所有操作。

另一个参数是实例,它存在于每个信号中,并且它带有当前实例对象。即在这种情况下当前时间的用户对象。例如:

 @receiver(post_save,发件人=用户)  
 def create_user_profile(sender, instance, created, **kwargs):  
 name = '{} {}'.join(instance.f_name, instance.l_name)  
 Profile.objects.create(用户=实例,名称=名称)

因此,用户模型附加了许多字段,并且实例在当前实例中具有所有这些字段值。假设您使用 f_name “John” 和 l_name “Doe” 创建了一个用户,其中包含所有用户名和密码,那么该接收器将接收到一个信号,并且在它的实例中它将具有所有这些值。

我们还可以执行许多其他操作,例如在保存对象后创建 slug,在某个事件后创建通知等。

总之,如果你想在某个事件发生后执行某个任务,那么你可以使用信号。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/25882/28491100

posted @ 2022-09-11 00:29  哈哈哈来了啊啊啊  阅读(41)  评论(0编辑  收藏  举报