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