以下代码是TranslatedContent类的一部分,该类为模型添加了一个自定义管理器。
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())
当自定义管理器已经存在时,它会为该管理器使用不同的名称。(在这种情况下是"translated")那不是我想要的。
如何使用相同的名称("objects")并仍然用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
之间可能发生的冲突。通常,最好由最终用户来决定他们是否希望自己的自定义管理器也包含TranslationManager
。
我建议在文档中简单地说明,只有在没有自定义管理器的情况下,才会将TranslationManager
添加为默认管理器。否则,用户应该让他们的自定义管理器从TranslationManager
继承以获得该功能。