0

シナリオ: 多くのサードパーティ製アプリを含む大規模プロジェクト。アプリのソースを変更せずに、それらのアプリにタグ付けを追加したい。

私が最初に考えたのは、最初に settings.py でモデルのリストを指定することでした ( のよう['appname.modelname',]に、それぞれで django-tagging のregister関数を呼び出します。register 関数は TagField とカスタム マネージャーを指定されたモデルに追加します。そのアプローチの問題はDBスキーマが生成される前に関数を実行する必要があること。

registerで関数を直接実行しようとしましたが、実際のモデル参照を文字列のみから取得するsettings.py必要があり、それをインポートできないようです-何を試してもImportErrorが発生します。ただし、機能はOKをインポートします。django.db.models.get_modelsettings.pytagging.register

そこで私は戦術を変更し、空のアプリにカスタム管理コマンドを書きました。問題は、syncdb にフックされる唯一のシグナルがpost_syncdb、DB スキーマが生成された後に発生するため、役に立たないことです。

現時点で考えられる唯一の他のアプローチは、「南」のようなデータベース スキーマ マイグレーションを生成して実行することです。これは解決策というよりもハックのようです。

これはかなり一般的なニーズのようですが、私はきれいな解決策を見つけることができませんでした.

私の質問は、スキーマが生成される前にモデルにフィールドを動的に追加することは可能ですか?具体的には、ソースを編集せずにサードパーティのモデルにタグ付けを追加することは可能ですか?

明確にするために、モデルに TagField がなくてもタグを作成して保存できることは知っていますが、そのアプローチには、新しいモデルの作成とタグ付けを同時に行うことが難しいという大きな欠陥があります。

4

1 に答える 1

1

ドキュメントから:

モデルをタグ付けアプリケーションで使用するためにモデルを登録する必要はありません。登録によって追加される機能の多くは、Tag および TaggedItem モデルとそのマネージャーによって提供されるタグ付け API の便利なラッパーに過ぎません。詳細については、以下で説明します。

システム内の任意のオブジェクトにタグを追加する方法については、API ドキュメントと以下の例を参照してください。

http://api.rst2a.com/1.0/rst2/html?uri=http://django-tagging.googlecode.com/svn/trunk/docs/overview.txt#tags

更新しました

#views.py
def tag_model_view(request, model_id):
    instance_to_tag = SomeModel.objects.get(pk=model_id)
    setattr(instance_to_tag, 'tags_for_instance', request.POST['tags'])
    ...
    instance_to_tag.save()
    ...returns response

#models.py
#this is the post_save signal receiver
def tagging_post_save_handler(sender, instance, created):
    if hasattr(instance, 'tags_for_instance'):
        Tag.objects.update_tags(instance, instance.tags_for_instance)
于 2010-03-14T22:31:23.143 に答える