5

のドキュメントでは、シグナル(、、など)のコールバック関数を見つけるのに適した場所であるとDjango指定されています。models.pypost_savepre_save

このコードはどこにあるべきですか?

信号処理と登録コードはどこにでも置くことができます。ただし、信号を送信する前に信号処理が登録されるように、モジュールが含まれているモジュールが早い段階でインポートされていることを確認する必要があります。これにより、アプリのmodels.pyはシグナルハンドラーの登録を行うのに適した場所になります。

ソース:https ://docs.djangoproject.com/en/dev/topics/signals/

ただし、シグナルに依存するビジネスロジックが大量にあり、すべてのモデルと同じファイルでシグナルを表示することが難しくなっています。

それらを別のファイルに移動したいのですが、どこでどのように参照できるのかわかりません。

したがって、次のファイル構造を前提として、適切な信号を含む2次(または3次など)ファイルを参照する方法の例を教えてください。

# models.py located in /myapp/some_installed_app/
from django import needed.modules
... # some reference to signals.py?

class SomeModel()
    pass

# signals.py located in /myapp/some_installed_app/
from django import needed.things
...

def somefun(sender,**kwargs)
    pass

post_save.connect(somefun, sender=SomeModel)
4

2 に答える 2

7

signal.pyの関数を維持しながら、models.pyのシグナルを「接続」するのはどうですか?


例:

# models
from myapp import signals
class MyModel(models.Model)
    pass
post_save.connect(signals.do_some_stuff_with_mymodel, sender = MyModel)

# signals
def do_some_stuff_with_mymodel(**kwargs):
    pass 

そうすれば、インポートする必要はまったくありmodelsませsignals

于 2012-12-30T22:27:14.517 に答える
1

もう1つのオプションは、__init__.pyファイルにシグナルをインポートすることでした。

これにより、早期登録が保証され、循環輸入が回避されたはずです。

于 2013-01-11T17:56:02.320 に答える