Django: シグナルを活用したイベント処理

Django 4 の実践(データ処理編)

日付:2025年2月18日

Django のシグナル機能を活用して、データベースの変更や特定のイベント発生時に自動処理を実行する方法を解説します。

目 次

はじめに

Django の シグナル (Signals) 機能を活用すると、 特定のイベント (データ保存、削除など) にフックして自動処理を実行 できます。

例えば、ユーザーが登録された際に メール通知を送信 したり、データが削除された際に バックアップを作成 するなどの処理を実装できます。

この記事で学べること

  • Django のシグナルとは何か
  • post_save, post_delete などの主要シグナルの活用
  • 実践的なカスタムシグナルの作成

1. Django のシグナルとは?

シグナルは、Django で 特定のアクションが発生したときに実行される処理 です。

📌 シグナルの基本概念

  1. シグナルを送信 (Sender) → 何かのイベントが発生
  2. シグナルを受信 (Receiver) → 関数が実行される

Django に組み込まれている主なシグナル

シグナル説明
pre_saveモデルの保存前に実行
post_saveモデルの保存後に実行
pre_deleteモデルの削除前に実行
post_deleteモデルの削除後に実行
m2m_changedManyToMany 関係の変更時に実行

2. post_save を使った自動処理

post_save シグナルを使うと、 モデルが保存された直後に処理を実行 できます。

例: ユーザー登録時にメールを送信

(1) シグナルの設定 (signals.py)

PYTHON
from django.db.models.signals import post_save from django.dispatch import receiver from django.contrib.auth.models import User from django.core.mail import send_mail @receiver(post_save, sender=User) def send_welcome_email(sender, instance, created, **kwargs): if created: send_mail( "ようこそ!", "Django サイトへの登録ありがとうございます。", "admin@example.com", [instance.email], fail_silently=False, )

ポイント:

  • post_save@receiver デコレーターで登録
  • createdTrue の場合にのみ処理を実行 (新規登録時のみ)
  • send_mail() を使ってメールを送信

(2) apps.py でシグナルを登録

PYTHON
class BaseConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'base' def ready(self): import base.signals # シグナルを登録

ポイント:

  • ready() メソッド内で signals.py をインポートしてシグナルを登録
  • これを忘れるとシグナルが動作しないので注意

3. post_delete を使ったデータ削除時の処理

例: ユーザー削除時にログを記録する

PYTHON
from django.db.models.signals import post_delete from django.dispatch import receiver from django.contrib.auth.models import User import logging logger = logging.getLogger(__name__) @receiver(post_delete, sender=User) def log_user_deletion(sender, instance, **kwargs): logger.info(f"ユーザー {instance.username} ({instance.email}) が削除されました。")

ポイント:

  • post_delete を使って、ユーザー削除後にログを記録
  • logger.info() で Django のロギングシステムにログを保存

4. カスタムシグナルの作成

Django では、独自のシグナルを作成することも可能です。

例: 記事の公開時に通知を送る

(1) カスタムシグナルを定義 (signals.py)

PYTHON
from django.dispatch import Signal article_published = Signal()

(2) シグナルを送信 (models.py の save() 内)

PYTHON
from django.db import models from .signals import article_published class Article(models.Model): title = models.CharField(max_length=255) content = models.TextField() is_published = models.BooleanField(default=False) def save(self, *args, **kwargs): if self.is_published: article_published.send(sender=self.__class__, instance=self) super().save(*args, **kwargs)

ポイント:

  • article_published.send() を使ってシグナルを発火
  • 記事が公開された (is_published=True) 場合にシグナルを送信

(3) シグナルの受信 (signals.py)

PYTHON
from django.dispatch import receiver from .signals import article_published @receiver(article_published) def notify_admin(sender, instance, **kwargs): print(f"管理者へ通知: 記事 '{instance.title}' が公開されました!")

ポイント:

  • @receiver(article_published) でシグナルを受信
  • 記事が公開されると管理者に通知を送る

5. まとめ

  • Django のシグナルを使うと、イベント発生時に自動処理を実装できる
  • post_save, post_delete などの組み込みシグナルを活用する
  • カスタムシグナルを作成して、独自のイベントフックを追加
  • apps.pysignals.py を登録し忘れないこと