これは、 Django1.7がリリースされたときにドキュメントに追加されました。
厳密に言えば、信号処理と登録コードは好きな場所に配置できますが、コードのインポートによる副作用を最小限に抑えるために、アプリケーションのルートモジュールとそのモデルモジュールを避けることをお勧めします。
実際には、シグナルハンドラーは通常、関連するアプリケーションのシグナルサブモジュールで定義されます。シグナルレシーバーは、アプリケーション構成クラスのready()メソッドに接続されています。Receiver()デコレータを使用している場合は、ready()内にsignalsサブモジュールをインポートするだけです。
Django 1.7で変更:ready()は以前のバージョンのDjangoには存在しなかったため、シグナル登録は通常モデルモジュールで行われました。
ベストプラクティスは、signalsサブモジュールのhandlers.pyでハンドラーを定義することです。たとえば、次のようなファイルです。
yourapp / signal / handlers.py:
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
pass
シグナルハンドラーを登録するのに最適な場所は、 ready()メソッドを使用して、シグナルハンドラーを定義するアプリのAppConfigです。これは次のようになります。
yourapp / apps.py:
from django.apps import AppConfig
class TasksConfig(AppConfig):
name = 'tasks'
verbose_name = "Tasks"
def ready(self):
import yourproject.yourapp.signals.handlers #noqa
設定.pyのINSTALLED_APPSで直接指定するか__init__
、アプリのでAppConfigを指定して、AppConfigを読み込んでいることを確認してください。詳細については、ready()のドキュメントを参照してください。
注:他のアプリにもリッスンするシグナルを提供している場合は__init__
、シグナルモジュールのにそれらを配置します(例:次のようなファイル)。
yourapp / signal / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
次に、別のアプリが信号をインポートして登録することで信号を聞くことができますfrom yourapp.signals import task_generate_pre_save
。信号をハンドラーから分離することで、物事をクリーンに保つことができます。
Django 1.6の手順:
それでもDjango1.6以下を使い続ける場合は、同じことを行います(yourapp / signal / handlers.pyでハンドラーを定義します)が、AppConfigを使用するのではなく、の__init__。pyを介してハンドラーをロードします。あなたのアプリ、例えば:
yourapp / __ init__.py
import signals
これは、循環インポートの問題を引き起こすことが多いため、ready()メソッドを使用するほど良くはありません。