Django-Signals信號量

信號量最爲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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章