Django在运行时扩展自定义管理器。 Mixin风格?

时间:2012-02-27 17:42:47

标签: python django

以下代码是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())

当自定义管理器已存在时,它会为管理器使用不同的名称。 (在这种情况下'翻译')这不是我想要的。

如何使用相同的名称('对象')并仍使用TranslationManager()覆盖它? 而不是覆盖,这将是一个覆盖/扩展。

1 个答案:

答案 0 :(得分:1)

可以做类似的事情:

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以获得该功能。