次のコードは、カスタムマネージャをモデルに追加する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())
しかし:
ありがとうございます。ドキュメントオプションを使用します。カスタムマネージャが存在する場合、警告をスローするのは「完了していませんか」ですか? –
議論の余地があります。それが重要なのであれば、実際にあなたの 'TranslationManager'を使う必要があるので、基本的に警告を警告として使用しています(つまり、彼らはそれをやめることを怠った場合、忘れてしまった)、警告がおそらく適切です。それ以外の場合は、そのままにしておくことをお勧めします。 –