Django のシグナル機能を活用して、データベースの変更や特定のイベント発生時に自動処理を実行する方法を解説します。
Django の シグナル (Signals) 機能を活用すると、 特定のイベント (データ保存、削除など) にフックして自動処理を実行 できます。
例えば、ユーザーが登録された際に メール通知を送信 したり、データが削除された際に バックアップを作成 するなどの処理を実装できます。
✅ この記事で学べること
post_save
, post_delete
などの主要シグナルの活用シグナルは、Django で 特定のアクションが発生したときに実行される処理 です。
📌 シグナルの基本概念
✅ Django に組み込まれている主なシグナル
シグナル | 説明 |
---|---|
pre_save | モデルの保存前に実行 |
post_save | モデルの保存後に実行 |
pre_delete | モデルの削除前に実行 |
post_delete | モデルの削除後に実行 |
m2m_changed | ManyToMany 関係の変更時に実行 |
post_save
シグナルを使うと、 モデルが保存された直後に処理を実行 できます。
✅ 例: ユーザー登録時にメールを送信
PYTHONfrom 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
デコレーターで登録created
が True
の場合にのみ処理を実行 (新規登録時のみ)send_mail()
を使ってメールを送信PYTHONclass BaseConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'base' def ready(self): import base.signals # シグナルを登録
✅ ポイント:
ready()
メソッド内で signals.py
をインポートしてシグナルを登録✅ 例: ユーザー削除時にログを記録する
PYTHONfrom 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 のロギングシステムにログを保存Django では、独自のシグナルを作成することも可能です。
✅ 例: 記事の公開時に通知を送る
PYTHONfrom django.dispatch import Signal article_published = Signal()
PYTHONfrom 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
) 場合にシグナルを送信PYTHONfrom 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)
でシグナルを受信post_save
, post_delete
などの組み込みシグナルを活用するapps.py
で signals.py
を登録し忘れないこと回 | タイトル | リンク |
---|---|---|
第 1 回 | Django: モデルの高度なフィールドとオプション | 詳 細 |
第 2 回 | Django: クエリ最適化 | 詳 細 |
第 3 回 | Django: カスタムモデルマネージャとクエリセット | 詳 細 |
第 4 回 | Django: シグナルを活用したイベント処理 | この記事 |
第 5 回 | Django: キャッシュとパフォーマンス最適化 | 詳 細 |
第 6 回 | Django: タイムゾーン・言語設定 | 詳 細 |
第 7 回 | Django: 日時処理(timezone の活用) | 詳 細 |
第 8 回 | Django: QuerySet 基本メソッド① | 詳 細 |
第 9 回 | Django: QuerySet 基本メソッド② | 詳 細 |
第 10 回 | Django: QuerySet の集計メソッド | 詳 細 |
当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。