ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django 信号 — 初学者

2022-09-11 01:04:41  阅读:325  来源: 互联网

标签:sender 用户 Django 实例 初学者 信号 post name


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

标签:sender,用户,Django,实例,初学者,信号,post,name
来源: https://www.cnblogs.com/amboke/p/16683293.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有