Django信号的类型和使用方式
简而言之
Signal是什么?
当数据发生更新或请求发生时,可以执行相应的处理。
例如,在想要通知数据已创建或同时创建其他数据时非常方便。
Django 官方文档
在哪里写比较好?
根据官方网站
严格来说,信号处理和注册代码可以放在任何你喜欢的地方,尽管建议避免放在应用的根模块和模型模块中,以最小化导入代码的副作用。
实际上,信号处理程序通常定义在与其相关的应用程序的信号子模块中。信号接收器在应用程序配置类的ready()方法中连接。 如果使用receiver()装饰器,请在ready()中导入信号子模块。
我完全不知道意思,但似乎定义为一个子模块是个好主意。
所以我创建了 signals.py!
分类
我能做什么呢?
名前意味pre_initモデルをインスタンス化した最初post_initモデルをインスタンス化した最後pre_saveモデルのsave()メソッドの最初post_saveモデルのsave()メソッドの最後m2m_changed中間テーブルの変更pre_migratemigrateを実行する前post_migratemigrateを実行した後request_startedHTTPリクエストを応答した最初request_finishedHTTPリクエストを応答した最後got_request_exceptionHTTPリクエスト中に例外が発生したらconnection_createdDBの接続が開始されたら
虽然 Django 官方网站上还有一些种类,但我很困了。(目前凌晨2:38)??
用法 fǎ)
为了让Django识别接受者,需要进行一些准备工作。
顺便提一句,这个应用程序的名字是“book”,是一个神秘的名字???
AppConfig已准备好。
将settings.py文件中的AppConfig进行参考。
DJANGO_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
THIRD_PARTY_APPS = [
'rest_framework',
'django_filters',
]
LOCAL_APPS = [
'common.apps.CommonConfig',
'book.apps.BookConfig', # <- こいつ
]
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
需要导入 app.py 和 signals.py。???
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _
class BookConfig(AppConfig):
name = 'book'
verbose_name = _('Book')
def ready(self):
try:
import book.signals
except ImportError:
pass
既然准备工作已经完成,那么就让我们开始在 signals.py 文件中继续往下写吧~ ????
写下接收者
写一个接收器装饰器,基本上它可以执行☺️☺️
所以,以下是pre_save的写作方式的示例!!!!
from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import Book
@receiver(pre_save, sender=Book)
def sample(sender, *args, **kwargs):
print(sender, args, kwargs)
在views.py或其他地方对模型对象进行save()操作后,会执行sample()函数。
class ListBook(APIView):
def get(self, request):
b = Book(# ゴニョゴニョいれる)
b.save()
return Response('success')
那么就这样吧☺️☺️☺️☺️