Como adicionar um gerente de campo

votos
2

O que eu quero fazer é quando algum modelo usar o meu campo, ele automaticamente irá adicionar gestor personalizado para esse modelo.

Tanto quanto eu sei, contibute_to_class fornecer tal funcionalidade

class MyCustomField(CharField):
    def contribute_to_class(self, cls, name):
        super(MyCustomField, self).contribute_to_class(cls, name)
        setattr(cls, 'custom_manager', CustomManager())

O problema é que no meu gerente de costume usar self.model._default_manager para fazer consultas sobre gerenciador padrão, mas quando eu tento fazê-lo, o Django diz AttributeError: objeto 'NoneType' tem nenhum atributo '_default_manager'

Se eu não usar contribute_to_class e escrever gerente de costume iside minha classe de modelo, ele funciona como esperado. Qual pode ser o problema?

Publicado 04/03/2009 em 08:25
fonte usuário
Em outras línguas...                            


2 respostas

votos
4

Gerentes, assim como campos, tem um método contribute_to_class, e se você não chamá-lo de que não será configurado corretamente. A maneira correta de chamá-lo é usando 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())
Respondeu 04/03/2009 em 17:04
fonte usuário

votos
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)
Respondeu 04/03/2009 em 09:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more