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')

那么就这样吧☺️☺️☺️☺️

广告
将在 10 秒后关闭
bannerAds