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 说 AttributeError: 'NoneType' object has no attribute '_default_manager'

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

4

2 回答 2

4

经理,就像 Fields 一样,有一个contribute_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())
于 2009-03-04T16:04:19.500 回答
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)
于 2009-03-04T08:35:40.637 回答