シグナル¶
Djangoが送信する全てのシグナルのリストです。全ての組み込みシグナルは send() メソッドを使用して送信されます。
参考
シグナルの登録方法と受信方法に関する情報については、シグナルディスパッチャ のドキュメントを参照してください。
認証フレームワーク は、ユーザーがログイン / ログアウトしたときに シグナルを送信します 。
モデルのシグナル¶
django.db.models.signals モジュールは、モデルシステムによって送信される一連のシグナルを定義しています。
警告
シグナルはコードの保守を難しくする可能性があります。モデルを更新し、追加ロジックを実行するために、 カスタムマネージャ にヘルパーメソッドを実装するか、あるいはモデルのシグナルを使用する前に モデルメソッドをオーバーライド することを検討してください。
警告
これらのシグナルの多くは、 __init__() や save() のような、自分のコードでオーバーライドできる様々なモデルメソッドによって送信されます。
これらのメソッドをモデルでオーバーライドする場合、これらのシグナルが送信されるように、親クラスのメソッドを呼び出さなければなりません。
Django はシグナルハンドラをデフォルトで弱参照として保存するため、ハンドラがローカル関数の場合、ガベージコレクションによって回収される可能性があります。これを防ぐために、シグナルの connect() を呼び出す際に weak=False を渡してください。
注釈
モデルシグナルの sender モデルは、レシーバを接続する際にその完全なアプリケーションラベルを指定することで、遅延参照ができます。例えば、 polls アプリケーションで定義された Question モデルは、'polls.Question' として参照できます。この種の参照は、循環インポートの依存関係や交換可能なモデルを扱う際に非常に便利です。
pre_init¶
-
django.db.models.signals.pre_init¶
Django モデルをインスタンス化するたびに、このシグナルはモデルの __init__() メソッドの開始時に送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- たった今インスタンスが作成されたモデルクラス。
args__init__()に渡される位置引数のリストです。kwargs__init__()に渡されるキーワード引数の辞書。
例えば、 チュートリアル にはこのような行があります:
q = Question(question_text="What's new?", pub_date=timezone.now())
pre_init ハンドラーに送信される引数は次の通りです:
| 引数 | 値 |
|---|---|
sender |
Question (クラスそのもの) |
args |
[] (位置引数が __init__() に渡されなかったため、空のリスト) |
kwargs |
{'question_text': "What's new?",
'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)} |
post_init¶
-
django.db.models.signals.post_init¶
pre_init と似ていますが、このイベントは __init__() メソッドが終了した時に送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- 上記の通り: たった今インスタンスが作成されたモデルクラス。
instanceたった今作成されたモデルの実際のインスタンス。
注釈
instance._stateは、post_initシグナルを送信する前に設定されていないため、_state属性は常にそのデフォルト値を持ちます。例えば、_state.dbはNoneです。
警告
パフォーマンス上の理由から、 pre_init または post_init シグナルのレシーバでクエリを実行するべきではありません。なぜなら、クエリセットのイテレート中に返される各インスタンスに対して実行されるからです。
pre_save¶
-
django.db.models.signals.pre_save¶
これは、モデルの save() メソッドの始まりに送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- モデルクラス。
instance- 保存される実際のインスタンス。
raw- 真偽値です。モデルがそのままの形 (例えば フィクスチャ を読み込む時) で保存されている場合は
Trueとなります。データベースがまだ一貫した状態にない可能性があるため、他のレコードをクエリしたり変更したりするべきではありません。 using- 使用されているデータベースのエイリアス。
update_fieldsModel.save()に渡された更新するフィールドのセット、もしくはupdate_fieldsがsave()に渡されなかった場合はNone。
post_save¶
-
django.db.models.signals.post_save¶
pre_save に似ていますが、 save() メソッドの最後に送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- モデルクラス。
instance- 保存される実際のインスタンス。
created- ブール値。レコードが作成された場合に
Trueを返す。 raw- 真偽値です。モデルがそのままの形 (例えば フィクスチャ を読み込む時) で保存されている場合は
Trueとなります。データベースがまだ一貫した状態にない可能性があるため、他のレコードをクエリしたり変更したりするべきではありません。 using- 使用されているデータベースのエイリアス。
update_fieldsModel.save()に渡された更新するフィールドのセット、もしくはupdate_fieldsがsave()に渡されなかった場合はNone。
pre_delete¶
-
django.db.models.signals.pre_delete¶
モデルの delete() メソッドとクエリセットの delete() メソッドの開始時に送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- モデルクラス。
instance- 実際に削除されるインスタンス。
using- 使用されているデータベースのエイリアス。
origin
削除の起点は、ModelまたはQuerySetクラスのインスタンスです。
post_delete¶
-
django.db.models.signals.post_delete¶
pre_delete のようですが、モデルの delete() メソッドとクエリセットの delete() メソッドの終わりに送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- モデルクラス。
instance実際に削除されるインスタンス。
このオブジェクトはデータベース内に存在しなくなるため、このインスタンスをどのように扱うか非常に注意してください。
using- 使用されているデータベースのエイリアス。
origin
削除の起点は、ModelまたはQuerySetクラスのインスタンスです。
m2m_changed¶
-
django.db.models.signals.m2m_changed¶
モデルインスタンス上の ManyToManyField が変更されたときに送信されます。厳密には、これはモデルシグナルではありません。なぜなら、これは ManyToManyField によって送信されるためです。しかし、モデルへの変更を追跡する際に、 pre_save/post_save および pre_delete/post_delete を補完するものであるため、ここに含まれています。
このシグナルとともに送信される引数は以下の通りです:
senderManyToManyFieldを記述する中間モデルクラスです。多対多フィールドが定義されたときに自動的に作成されます。多対多フィールドのthrough属性を使用してアクセスできます。instance- 多対多のリレーションが更新されたインスタンス。これは
senderのインスタンス、またはManyToManyFieldが関連づけられているクラスのインスタンスのいずれかです。 actionリレーションに対して行われた更新の種類を表す文字列です。次のいずれかの値を取ります。
"pre_add"- リレーションにオブジェクトが1つ以上追加される 前 に送信されます。
"post_add"- リレーションに1つ以上のオブジェクトが追加された 後 に送信されます。
"pre_remove"- リレーションから 1 つ以上のオブジェクトが削除される 前 に送信されます。
"post_remove"- リレーションから1つ以上のオブジェクトが削除された 後に 送信されます。
"pre_clear"- リレーションがクリアされる 前に 送信されます。
"post_clear"- リレーションがクリアされた 後 に送信されます。
reverse- リレーションのどちらの側が更新されているかを示します (つまり、更新されているのが順方向のリレーションか、逆方向のリレーションかを表します)。
model- リレーションに追加、削除、またはクリアされるオブジェクトのクラス。
pk_setpre_addとpost_addアクションの場合、これはリレーションに追加される、または追加された主キー値のセットです。既存の値をフィルタリングしてデータベースのIntegrityErrorを避ける必要があるため、追加されることが提出された値のサブセットである可能性があります。pre_removeとpost_removeアクションにおいて、これはリレーションから削除されることが提案された主キーの値のセットです。これは、値が実際に削除されるか、または削除されたかどうかに依存しません。特に、存在しない値が提出されることもあり、pk_setに表示されますが、データベースには影響を与えません。pre_clearとpost_clearアクションの場合、これはNoneです。using- 使用されているデータベースのエイリアス。
たとえば、Pizza が複数の Topping オブジェクトを持てるとしたら、次のようにモデル化されます。
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
# ...
toppings = models.ManyToManyField(Topping)
このようにハンドラーを接続した場合:
from django.db.models.signals import m2m_changed
def toppings_changed(sender, **kwargs):
# Do something
pass
m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)
そして、次のようにした場合:
>>> p = Pizza.objects.create(...)
>>> t = Topping.objects.create(...)
>>> p.toppings.add(t)
m2m_changed ハンドラ (上記の例では toppings_changed) に送信された引数は、次の通りです:
| 引数 | 値 |
|---|---|
sender |
Pizza.toppings.through (中間の m2m クラス) |
instance |
p (変更されている Pizza インスタンス) |
action |
"pre_add" (その後に別のシグナルで "post_add" が続く) |
reverse |
False (Pizza には ManyToManyField が含まれているため、この呼び出しは順方向のリレーションを変更します) |
model |
Topping ( Pizza に追加されるオブジェクトのクラス) |
pk_set |
{t.id}``(リレーションには ``Topping t だけが追加されたため) |
using |
"default" (デフォルトルーターが書き込みをここに送るため) |
そして、次のようなことをした場合:
>>> t.pizza_set.remove(p)
m2m_changed ハンドラに送信される引数は以下の通りです:
| 引数 | 値 |
|---|---|
sender |
Pizza.toppings.through (中間の m2m クラス) |
instance |
t (変更されている Topping インスタンス) |
action |
"pre_remove" (その後に別のシグナルとして "post_remove" が続きます) |
reverse |
True (Pizza は ManyToManyField を含んでいるため、この呼び出しは逆方向のリレーションを変更します) |
model |
Pizza (Topping から取り除かれたオブジェクトのクラス) |
pk_set |
{p.id} (リレーションから Pizza p のみが削除されたため) |
using |
"default" (デフォルトルーターが書き込みをここに送るため) |
class_prepared¶
-
django.db.models.signals.class_prepared¶
モデルクラスが「準備完了」したとき――つまり、モデルが定義され、Djangoのモデルシステムに登録された後に送信されます。Djangoはこのシグナルを内部的に使用しています。通常、サードパーティのアプリケーションで使用されることはありません。
このシグナルはアプリ登録プロセス中に送信されます。そして AppConfig.ready() はアプリ登録が完全に終了した後に実行されますので、レシーバーをそのメソッド内で接続することはできません。一つの可能性としては、 AppConfig.__init__() の中でそれらを接続することですが、モデルをインポートしたり、アプリ登録への呼び出しを触発しないよう注意が必要です。
このシグナルで送信される引数:
sender- たった今準備されたモデルクラス。
管理シグナル¶
django-admin によって送信されるシグナル。
pre_migrate¶
-
django.db.models.signals.pre_migrate¶
migrate コマンドによって、アプリケーションのインストールを開始する前に送信されます。models モジュールがないアプリケーションには発行されません。
このシグナルとともに送信される引数は以下の通りです:
sender- マイグレーションまたは同期される予定のアプリケーションのための
AppConfigインスタンスです。 app_configsenderと同じ。verbositymanage.pyが画面上にどれだけ情報を表示しているかを示します。詳細については--verbosityフラグを参照してください。pre_migrateのためにリスナーとなる関数は、この引数の値に基づいて画面出力を調整するべきです。interactiveinteractiveがTrueの場合、コマンドラインでユーザーに入力を求めるのは安全です。interactiveがFalseの場合、このシグナルを待ち受ける関数は何も求めてはいけません。たとえば、
django.contrib.authアプリは、interactiveがTrueのときのみスーパーユーザーの作成を促します。stdout- 冗長な出力をリダイレクトすべきストリームのようなオブジェクト。
using- コマンドが操作を行うデータベースのエイリアスです。
plan- マイグレーション実行に使用されるマイグレーションプランです。プランはパブリックAPIではありませんが、プランを知る必要がある稀なケースに対応します。プランは2値タプルのリストで、最初の項目はマイグレーションクラスのインスタンスであり、2番目の項目はマイグレーションがロールバックされた (
True) か適用された (False) かを示します。 apps- マイグレーションを実行する前のプロジェクトの状態を含む
Appsのインスタンスです。操作を行いたいモデルを取得するために、グローバルなappsレジストリの代わりに使用すべきです。
post_migrate¶
-
django.db.models.signals.post_migrate¶
migrate コマンドの終わりに (マイグレーションが行われなくても)、そして flush コマンドの後に送信されます。models モジュールがないアプリケーションには発行されません。
このシグナルのハンドラは、データベーススキーマの変更を行ってはなりません。なぜなら、そのような変更を行うと、migrate コマンド実行中に flush コマンドが失敗する可能性があるからです。
このシグナルとともに送信される引数は以下の通りです:
sender- インストールされたばかりのアプリケーション用の
AppConfigインスタンスです。 app_configsenderと同じ。verbositymanage.pyが画面上にどれだけ情報を表示しているかを示します。詳細については--verbosityフラグを参照してください。post_migrateを待ち受ける関数は、この引数の値に基づいて画面に出力する内容を調整する必要があります。interactiveinteractiveがTrueの場合、コマンドラインでユーザーに入力を求めるのは安全です。interactiveがFalseの場合、このシグナルを待ち受ける関数は何も求めてはいけません。たとえば、
django.contrib.authアプリは、interactiveがTrueのときのみスーパーユーザーの作成を促します。stdout- 冗長な出力をリダイレクトすべきストリームのようなオブジェクト。
using- 同期に使用されるデータベースエイリアスです。デフォルトは
defaultデータベースです。 plan- マイグレーション実行に使用されたマイグレーションプラン。プランはパブリックAPIではありませんが、プランを知る必要がある稀な場合に対応します。プランは2値タプルのリストで、最初の項目はマイグレーションクラスのインスタンスであり、2番目の項目はマイグレーションがロールバックされたか(
True)適用されたか(False)を示します。 apps- マイグレーション実行後のプロジェクトの状態を保持する
Appsのインスタンスです。グローバルなappsレジストリの代わりに、操作を行いたいモデルを取得するために使用するべきです。
たとえば、次のように AppConfig にコールバックを登録できます:
from django.apps import AppConfig
from django.db.models.signals import post_migrate
def my_callback(sender, **kwargs):
# Your specific logic here
pass
class MyAppConfig(AppConfig):
...
def ready(self):
post_migrate.connect(my_callback, sender=self)
注釈
AppConfig インスタンスを sender 引数として提供する場合は、シグナルが ready() で登録されていることを確認してください。 AppConfig は、 INSTALLED_APPS の変更されたセットで実行されるテストのために再作成されます(例えば設定が上書きされた場合など)し、そのようなシグナルは新しい AppConfig インスタンスごとに接続されるべきです。
リクエスト/レスポンス シグナル¶
リクエストを処理する際にコアフレームワークによって送信されるシグナル。
警告
シグナルはコードのメンテナンスを難しくする可能性があります。リクエスト/レスポンスシグナルを使用する前に、 ミドルウェアを使用する ことを検討してください。
request_started¶
-
django.core.signals.request_started¶
Django が HTTP リクエストの処理を開始したときに送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- リクエストを処理したハンドラクラス。例えば
django.core.handlers.wsgi.WsgiHandlerが該当します。 environ- リクエストに提供される
environ辞書。
request_finished¶
-
django.core.signals.request_finished¶
クライアントへの HTTP レスポンスの配信が完了したときに送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- 上述のようなハンドラークラスです。
got_request_exception¶
-
django.core.signals.got_request_exception¶
このシグナルは、Djangoが受信HTTPリクエストの処理中に例外に遭遇したときにいつでも送信されます。
このシグナルとともに送信される引数は以下の通りです:
sender- 使用されません (常に
None)。 requestHttpRequestオブジェクト。
テストシグナル¶
テストを 実行しているとき のみ送信されるシグナル。
setting_changed¶
-
django.test.signals.setting_changed¶
このシグナルは、 django.test.TestCase.settings() コンテキストマネージャや django.test.override_settings() デコレータ/コンテキストマネージャを通じて設定の値が変更されたときに送信されます。
実際には2回送信されます。新しい値が適用されたとき("setup")と、元の値が復元されたとき("teardown")。2つを区別するには、enter 引数を使用してください。
このシグナルは django.core.signals からインポートすることもできます。これにより、テスト以外の状況で django.test からインポートすることを避けられます。
このシグナルとともに送信される引数は以下の通りです:
sender- 設定ハンドラ。
setting- 設定の名前。
value- 設定変更後の設定値です。初めに存在しない設定の場合、 "teardown" フェーズでは
valueはNoneです。 enter- 真偽値。設定が適用されている場合は
True、復元された場合はFalse。
データベースラッパー¶
データベース接続が開始されたときに、データベースラッパーによって送信されるシグナル。
connection_created¶
-
django.db.backends.signals.connection_created¶
データベースラッパーがデータベースに最初の接続を行ったときに送信されます。これは、SQLバックエンドに接続後のコマンドを送信したい場合に特に便利です。
このシグナルとともに送信される引数は以下の通りです:
sender- データベースラッパークラス ― つまり、
django.db.backends.postgresql.DatabaseWrapperやdjango.db.backends.mysql.DatabaseWrapperなどです。 connection- オープンされたデータベース接続です。これは、複数のデータベース設定を使用する際に、異なるデータベースからの接続シグナルを区別するために使用されます。