如何从Field添加Manager

时间:2009-03-04 07:25:53

标签: django django-managers django-models

我想要做的是当某个模型使用我的字段时,它会自动为该模型添加自定义管理器。

据我所知,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说AttributeError:'NoneType'对象没有属性'_default_manager'

如果我不使用contrib_to_class并在我的模型类中编写自定义管理器,它会按预期工作。可能是什么问题?

2 个答案:

答案 0 :(得分:4)

管理员,就像Fields一样,有一个contrib_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())

答案 1 :(得分: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)