2012-02-27 46 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()覆盖它? 而不是覆盖,这将是一个覆盖/扩展。

回答

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

+0

谢谢,你是对的,我会去与文件选项。如果有自定义管理器存在,是否“未做”警告? – 2012-02-28 09:57:12

+0

这是有争议的。如果它足够重要,因为它们确实需要使用'翻译管理器',并且基本上只是使用警告作为提醒(即,如果他们忽视这样做,那只是因为他们忘了,并不是因为他们没有选择到),那么警告也许是适当的。否则,最好不要管它。 – 2012-02-28 15:14:45