信號量最爲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_finished
Django開始或完成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