2013-03-25 18 views
10

作成したアプリケーションの大きな変更に対してテスト環境を設定し、システムに存在するデータが新しいアプリケーションに容易にロードされるようにしたいとしますシステム。loaddataがpost_save信号を無視または無効にする

Djangoは、データのエクスポートと読み込みのためのコマンドライン機能を提供します。 dumpdataloaddata

python manage.py dumpdata app.Model > Model.json 
python manage.py loaddata Model.json 

を経由してドキュメント、いくつかの信号がこのプロセス中に無視されていることを識別(明示されていないが):フィクスチャファイルが処理されるときであるとして

、データはデータベースに保存されます。モデル定義の保存メソッドとpre_save信号は呼び出されません。 (source

loaddataプロセス中post_save信号の呼び出しを無効にする方法はありますか?

おそらく関連:

+0

[どのように私はdjango post \ _save信号コードとの競合を防ぐのですか?](http://stackoverflow.com/questions/3499791/how-do-i-prevent-fixtures-from-conflicting- with-django-post-save-signal-code) – Louis

答えて

24

これを達成する1つの方法は、信号があなたの受信機機能に派遣されたときに、生のキーワード引数を探しデコレータを追加することです。これはDjango 1.4.3でうまくいきました。私は1.5でテストしていませんが、それでも動作するはずです。そして

from functools import wraps 
def disable_for_loaddata(signal_handler): 
    """ 
    Decorator that turns off signal handlers when loading fixture data. 
    """ 

    @wraps(signal_handler) 
    def wrapper(*args, **kwargs): 
     if kwargs.get('raw'): 
      return 
     signal_handler(*args, **kwargs) 
    return wrapper 

:ドキュメント当たり

@disable_for_loaddata 
def your_fun(**kwargs): 
    ## stuff that won't happen if the signal is initiated by loaddata process 

は、生キーワードがある:真(すなわち、固定具のロード時に)提示されたモデルが正確に保存されている場合。

+0

これは、関数、またはpost_save.connect()のデコレータとして機能しますか? –

+1

@BrandonBertelsen関数には、関数デコレータであるためです。 –

+0

kwargsとkwargs ['raw']: ' の' raw 'なら、 '' functools'依存関係を削除しましたが、 – GergelyPolonkai

関連する問題