4

post_save明らかな理由もなく 2 回呼び出されるという問題に遭遇しました。ここで説明されているように、原因は二重インポートだったようです: Why is post_save being raise during the save of a Django model? 受け入れた回答は、機能したmysite部分を削除することを提案mysite.fooしていますが、なぜ二重インポートを行うのですか?

4

1 に答える 1

3

この問題は、Pythonでインポートパスが混在していることが原因で発生します。たとえば、でproj見つけることができる次の構造を考えてみましょう。sys.path

proj/
   __init__.py
   app/
       __init__.py
       foo.py

# In proj directory, enter Python shell
>>> import sys

>>> before = set(sys.modules)
>>> import app.foo
>>> set(sys.modules) - before
set(['app', 'app.foo'])

>>> before = set(sys.modules)
>>> from proj.app import foo
>>> set(sys.modules) - before
set(['proj.app.foo', 'proj', 'proj.app'])

Pythonは、実際にはとを異なるモジュールとして扱いproj.app.fooますapp.fooapp/__init__.pyそれを見つけてapp/foo.py2回インポートすることができるので、実際には2回実行されます。これを修正するには、projレベルからまたは../projレベルからの一貫したインポートパスを使用する必要があります。あなたが投稿したリンクで'mysite.blog'は、プロジェクトやDjangoimport blogファイルのような他のインポートがない限り問題ありません。

Django 1.4では、この問題は、manage.pyをプロジェクトディレクトリからパッケージではなくなった親ディレクトリに1つ上のディレクトリに移動することでほとんど解決され、インポートをprojレベルに制限します。

また、を使用して重複信号を防ぐことができますdispatch_uid

于 2012-04-22T04:14:07.463 に答える