Как добавить менеджера из поля - PullRequest
2 голосов
/ 04 марта 2009

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

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

4 голосов
/ 04 марта 2009

Менеджеры, как и 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 голос
/ 04 марта 2009
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...