くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Djangoでシグナルを受け取ってみる

Djangoでは、特定のイベントが発生したときに、何らかの処理ができるような仕組み(Signals))がある。
たとえば、モデルを保存したり、削除したときになにか処理させるとか。

サンプル

こちらの記事の登録完了メールの例を引用。(すごくわかりやすい。。)
ユーザが作成されるとメールが送る例。

まずは、受け取る関数を作成。ファイル名はsignals.py。

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail

from .models import User

# 受け取る関数に、@receiverをつける
# シグナルの種類(post_save)と、送ってくるクラス(sender)を設定
@receiver(post_save, sender=User)
def send_registered_mail_handler(sender, instance, created, **kwargs):
    if created and instance.email:
        send_mail('[タイトル] 登録完了', 'しました(本文)',
                  'no-reply@crohaco.net', [instance.email])

作成したsignals.pyを読み込むようにAppConfigの設定を変更

from django.apps import AppConfig

class MyappConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        from . import signals

INSTALL_APPSには、AppConfigを読み込む形で設定。

INSTALL_APPS = (
    # :
    # : someapp
    'myapp.apps.MyappConfig',
)

若干ハマったのが、以下の2点 - app.py内で初期化後にimportする必要があるので,AppConfigを設定する必要がある - post_saveupdate_fieldsは、DRFだと空が返ってくる。。 - update_fieldsは、Model.save(update_fields="")に指定されたフィールドが返ってくるため。

以上!!

参考にしたサイトさま