Angular, Blockchain, Science とか

Angular, Blockchain, Science全般 の情報を主に書いていきます。

Django signals についてのまとめ 個人的メモ

Djangoのsignals がよくわからなかったのでいろいろ調べてみました。
参考サイト
coderwall.com
simpleisbetterthancomplex.com

もちろん公式ドキュメントも。

まず、大まかな概念
signalsには、2つの重要な要素があります。senderreceiverです。senderはsignalを送信します。receiverはsignalを受け取り何らかの処理をします。

A receiver must be a function or an instance method which is to receive signals.

A sender must either be a Python object, or None to receive events from any sender.

from django.dispatch import receiver
from django.core.signals import post_save
from django.contrib.auth.models import User

@receiver(post_save, sender=User)
def ensure_profile_exists(sender, **kwargs):
    if kwargs.get('created', False):
        UserProfile.objects.get_or_create(user=kwargs.get('instance'))

一行ずつ見ていきます。

@receiver(post_save, sender=User)

@receiverはUserモデルがデータベースに保存されるのに目を向けて、そのような処理が行われるときにコードが実行されるの待っているreceiverがあるとDjango に伝える。
要はpost_save は保存 sender=User はUserモデルで Userモデルにデータが保存されるときに呼び出されるのが@receiver

def ensure_profile_exists(sender, **kwargs):

post_save signal が傍受されたときに呼ばれる関数を定義します。関数名はその名の通りプロファイルが存在することを確かにする関数。sender と同時に **kwargs も引数として与えます。

if kwargs.get('created', False):
      UserProfile.objects.get_or_create(user=kwargs.get('instance'))