2009-03-04 57 views
2

我想要做的是當某個模型使用我的字段時,它會自動將自定義管理器添加到該模型。如何從字段添加管理器

據我所知,contibute_to_class提供這樣的功能

class MyCustomField(CharField): 
    def contribute_to_class(self, cls, name): 
     super(MyCustomField, self).contribute_to_class(cls, name) 
     setattr(cls, 'custom_manager', CustomManager()) 

的問題是,在我的自定義管理器,我使用self.model._default_manager做查詢的默認管理器,但是當我嘗試這樣做, django說屬性錯誤:'NoneType'對象沒有屬性'_default_manager'

如果我不使用contribution_to_class並寫自定義管理器是我的模型類,它按預期工作。可能是什麼問題?

回答

1
class MyCustomField(CharField): 
    def contribute_to_class(self, cls, name): 
     super(MyCustomField, self).contribute_to_class(cls, name) 
     manager = CustomManager() 
     manager.model = cls 
     setattr(cls, 'custom_manager', manager) 
+0

手動設置manager.model是hacky和fragile。這只是Manager.contribute_to_class的一部分 - 真正的解決方案是確保Manager.contribute_to_class被正確調用。 – 2009-03-04 16:02:03

4

經理,就像Fields一樣,有一個contribution_to_class方法,如果你不調用它,他們將不能正確設置。調用它的正確方法是使用Model.add_to_class:

class MyCustomField(CharField): 
    def contribute_to_class(self, cls, name): 
     super(MyCustomField, self).contribute_to_class(cls, name) 
     cls.add_to_class('custom_manager', CustomManager()) 
相關問題