シナリオ: 多くのサードパーティ製アプリを含む大規模プロジェクト。アプリのソースを変更せずに、それらのアプリにタグ付けを追加したい。
私が最初に考えたのは、最初に settings.py でモデルのリストを指定することでした ( のよう['appname.modelname',]
に、それぞれで django-tagging のregister
関数を呼び出します。register 関数は TagField とカスタム マネージャーを指定されたモデルに追加します。そのアプローチの問題はDBスキーマが生成される前に関数を実行する必要があること。
register
で関数を直接実行しようとしましたが、実際のモデル参照を文字列のみから取得するsettings.py
必要があり、それをインポートできないようです-何を試してもImportErrorが発生します。ただし、機能はOKをインポートします。django.db.models.get_model
settings.py
tagging.register
そこで私は戦術を変更し、空のアプリにカスタム管理コマンドを書きました。問題は、syncdb にフックされる唯一のシグナルがpost_syncdb
、DB スキーマが生成された後に発生するため、役に立たないことです。
現時点で考えられる唯一の他のアプローチは、「南」のようなデータベース スキーマ マイグレーションを生成して実行することです。これは解決策というよりもハックのようです。
これはかなり一般的なニーズのようですが、私はきれいな解決策を見つけることができませんでした.
私の質問は、スキーマが生成される前にモデルにフィールドを動的に追加することは可能ですか?具体的には、ソースを編集せずにサードパーティのモデルにタグ付けを追加することは可能ですか?
明確にするために、モデルに TagField がなくてもタグを作成して保存できることは知っていますが、そのアプローチには、新しいモデルの作成とタグ付けを同時に行うことが難しいという大きな欠陥があります。