Как добавить менеджера из поля

Что я хочу сделать, так это то, что когда какая-то модель использует мое поле, она автоматически добавит к этой модели настраиваемый менеджер.

Насколько я знаю, 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»

Если я не использую вклад_в_класс и пишу собственный менеджер внутри класса моей модели, он работает, как и ожидалось. В чем может быть проблема?


person user20955    schedule 04.03.2009    source источник


Ответы (2)


У менеджеров, как и у полей, есть метод submit_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())
person Carl Meyer    schedule 04.03.2009

person    schedule
comment
Установка manager.model вручную является хакерской и хрупкой. Это только часть того, что делает Manager.contribute_to_class — реальное решение состоит в том, чтобы обеспечить правильный вызов Manager.contribute_to_class. - person Carl Meyer; 04.03.2009