2016-09-02 15 views
1

他のモジュールから関数を呼び出すマイグレーションでカスタムコマンドを実行したいと思います。これらの関数はいくつかのモデルを使用していますが、私はスキーマのバージョンが一致していません(OperationalError: (1054, "Unknown column 'foo' in 'bar'")バージョン管理されたアプリケーションレジストリのモデルをグローバルに使用する

私はこれらのモデルをカスタムコマンドで使用する場合、apps.get_model('my_app', 'bar')でモデルにアクセスしますが、私はそれを行うことができない外部関数、。

私は確信している、私は何かを見つけることができませんでしたが、誰かがこの前に走った。

私はunittest.mock.patchデコレータを使用して考えていたが、それは感じていません適切なソリューションのように。

これはもっと一般的な解決策ですか?

答えて

2

バージョン管理されたアプリケーションレジストリは、グローバルにアクセスできません。あなたは、関数のパラメータとしてモデルを渡し、デフォルトとして現在のモデルを使用することができます:あなたはそれを呼び出すときに、正規のコードから呼び出すが、場合bar_modelパラメータを渡す必要はありません

from my_app.models import Bar 

def my_function(..., bar_model=Bar): 
    # Use bar_model instead of Bar 

# Your RunPython function 
def migrate_something(apps, schema_editor): 
    my_function(bar_model=apps.get_model('my_app', 'bar')) 

マイグレーションから履歴モデルを渡すことができます。

あなたは複数のモデルが必要な場合は、代わりにappsを渡すことができます。

from django.apps import apps as global_apps 

def my_function(..., apps=global_apps): 
    Bar = apps.get_model('my_app', 'bar') 
+0

ポイントです:外部関数は、生産で実行され、モデルで動作し、さらに関数を呼び出すように私には、モデルの周りに渡す避けたいのですがそれらを変更するとエラーが発生しやすくなります。私は何とかそれらを猿のパッチにしたいと思ったが、それは不可能なので、機能を管理コマンドとして追加し、手動で実行する – fodma1

関連する問題