2012-02-27 5 views
1

次のコードは、カスタムマネージャをモデルに追加するTranslatedContentクラスの一部です。Djangoは実行時にカスタムマネージャを拡張します。ミックスインスタイル?

if hasattr(cls, 'objects'): 
    if cls.objects.__class__ == models.Manager: 
     # default manager, override 
     cls.add_to_class('objects', TranslationManager() 
    else: 
     # there is a custom manager, don't override 
     cls.add_to_class('translated', TranslationManager()) 

カスタムマネージャーが既に存在する場合、マネージャーには別の名前が使用されます。 (この場合、「翻訳」されています)それは私が望むものではありません。

どうすれば同じ名前( 'objects')を使用できますか、それでもTranslationManager()で上書きできますか? 上書きの代わりに、上書き/上書きされます。あなたは、元マネージャーとあなたのTranslationManagerの間に発生する可能性がある特定の紛争では、名前空間について非常に慎重にする必要があり、

if hasattr(cls, 'objects'): 
    if cls.objects.__class__ == models.Manager: 
     # default manager, override 
     cls.add_to_class('objects', TranslationManager() 
    else: 
     # there is a custom manager, don't override 
     class CombinedManager(cls.objects.__class__, TranslationManager): 
      pass 
     cls.add_to_class('objects', CombinedManager()) 

しかし:

答えて

1

あなたはのような何かを行うことができます。一般的には、エンドユーザに任せて、カスタムマネージャにTranslationManagerを含めるかどうかを決定することをお勧めします。

TranslationManagerは、カスタムマネージャが存在しない場合にのみ、デフォルトのマネージャとして追加されることを伝えることをお勧めします。それ以外の場合は、その機能を得るために、カスタムマネージャーにTranslationManagerを継承させる必要があります。

+0

ありがとうございます。ドキュメントオプションを使用します。カスタムマネージャが存在する場合、警告をスローするのは「完了していませんか」ですか? –

+0

議論の余地があります。それが重要なのであれば、実際にあなたの 'TranslationManager'を使う必要があるので、基本的に警告を警告として使用しています(つまり、彼らはそれをやめることを怠った場合、忘れてしまった)、警告がおそらく適切です。それ以外の場合は、そのままにしておくことをお勧めします。 –

関連する問題