共计 1252 个字符,预计需要花费 4 分钟才能阅读完成。
信号量最为 Django 的一个核心知识点,在项目中很少有使用到,所以很多人都不了解或者没听过过 (包括我)。简单来说就是在进行一些操作的前后我们可以发出一个信号来获得特定的操作,这些操作包括 (信息来自:https://yiyibooks.cn/xx/Djang…:
django.db.models.signals.pre_save&django.db.models.signals.post_save 在模型 save() 方法调用之前或之后发送。
django.db.models.signals.pre_delete&django.db.models.signals.post_delete 在模型 delete() 方法或查询集的 delete() 方法调用之前或之后发送。
django.db.models.signals.m2m_changed 模型上的 ManyToManyField 修改时发送。
django.core.signals.request_started&django.core.signals.request_finishedDjango 开始或完成 HTTP 请求时发送。
其他细致的知识点,大家可以点链接查看,直接通过一个例子解释:
在自定义用户模型类的时候,在后台添加用户数据因为使用了自定义模型类的 create 所以密码会以明文保存,接下来使用信号量方式在保存后马上修改密码解决。(网上一个项目的例子)
users/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth import get_user_model
User = get_user_model()
# post_save: 上面七大方法之一:在模型保存之后的操作
# sender: 发出信号的 model
@receiver(post_save, sender=User)
def create_user(sender, instance=None, created=False, **kwargs):
“””
sender: 模型类。
instance: 保存的实际实例。
created: 如果创建了新记录 True。
update_fields:Model.save() 要更新的字段集,如果没有传递则为 None
“””
if created:
password = instance.password
# instance 相当于 user
instance.set_password(password)
instance.save()
users/apps.py
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = ‘users’
verbose_name = ‘ 用户管理 ’
def ready(self):
“”” 使用 ready 加载, 否则不生效 ”””
import users.signals