2009-03-04 2 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 говорит, что атрибут AttributeError: объект «NoneType» не имеет атрибута «_default_manager»

Если я не использую Contrib_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

Настройка диспетчера.model вручную хакерская и хрупкая. Это лишь часть того, что делает Manager.contribute_to_class - реальное решение состоит в том, чтобы обеспечить правильность вызова Manager.contribute_to_class. –

4

Менеджеры, так же, как поля, есть метод 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()) 
Смежные вопросы