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



以下代码是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继承以获得该功能。

最新更新