21

作成したアプリケーションに大きな変更を加えるためのテスト環境をセットアップし、システムに存在するデータが新しいシステムに簡単に読み込まれることを確認するとします。

Djangoは、データをエクスポートおよびロードするためのコマンドライン機能を提供します。経由dumpdataloaddata

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

ドキュメントは、このプロセス中に一部の信号が無視されることを(明示的にではありませんが)識別します。

フィクスチャファイルが処理されると、データはそのままデータベースに保存されます。モデル定義のsaveメソッドとpre_saveシグナルは呼び出されません。(ソース

post_saveプロセス中にシグナル呼び出しを無効にする方法はありloaddataますか?

おそらく関連:

4

1 に答える 1

40

これを実現する1つの方法は、シグナルがレシーバー関数にディスパッチされるときにrawキーワード引数を検索するデコレーターを追加することです。これはDjango1.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

ドキュメントによると、rawキーワードは次のとおりです。モデルが提示されたとおりに保存されている場合(つまり、フィクスチャをロードする場合)はTrueです。

于 2013-03-25T21:28:57.040 に答える