Django 使用 signals 在數據被新增、修改、刪除時執行一些業務邏輯

1、模型示例

from django.db import models
from soft_delete_it.models import SoftDeleteModel

class BaseModel(models.Model):
    sort = models.IntegerField(default=1, verbose_name='排序')
    content = models.TextField(default='', blank=True, verbose_name='描述')
    sort_time = models.DateTimeField(auto_now_add=True, verbose_name='排序時間')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='創建時間')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新時間')

    class Meta:
        abstract = True


class ConfDict(SoftDeleteModel, BaseModel):
    dict_type_choices = (
        (0, '類型一'),
        (1, '類型二'),
        (2, '類型三'),
    )
    dict_title = models.CharField(max_length=255, verbose_name='字典標題')
    dict_key = models.IntegerField(default=0, verbose_name='字典鍵值')
    dict_type = models.IntegerField(default=0, choices=dict_type_choices, verbose_name='字典類型')

    class Meta:
        db_table = 'A_ConfDict_Table'
        verbose_name = '系統字典表'
        verbose_name_plural = verbose_name

2、在同級目錄下新增一個signals.py文件

from datetime import datetime
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from .models import ConfDict
from django.db import transaction


@transaction.atomic
@receiver(post_save, sender=ConfDict)
def create_update_object(sender, instance=None, created=False, **kwargs):
    '''
    :param sender:
    :param instance:
    :param created:
    :param kwargs:
    :return:
    '''
    print('對象保存時 signals流轉詳情:')
    print(sender)
    if created:
        print('新增時:', instance)
    else:
        print('修改時:', instance)
    

@transaction.atomic
@receiver(post_delete, sender=ConfDict)
def delete_object(sender, instance=None, **kwargs):
    '''
    :param sender:
    :param instance:
    :param kwargs:
    :return:
    '''
    print('對象刪除時 查看signals流轉詳情:')
    print(sender)
    print('被刪除的對象:', instance)

3、修改同級目錄下的apps.py以應用signals

from django.apps import AppConfig


class BaseConfig(AppConfig):
    name = 'base'

    # 激活signals
    def ready(self):
        import base.signals

重新運行服務即可

發佈了264 篇原創文章 · 獲贊 202 · 訪問量 110萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章