2011-06-16 29 views
26

Tengo algo de código que se parece a esto:Cómo anular el valor predeterminado de un campo de modelo de una base abstracta Clase

class BaseMessage(models.Model): 
    is_public = models.BooleanField(default=False) 
    # some more fields... 

    class Meta: 
     abstract = True 

class Message(BaseMessage): 
    # some fields... 

y me gustaría cambiar el valor por defecto del campo is_public en el modelo de Mensaje para que sea True para ese modelo.

He revisado algunos documentos relevantes de Django y hurgué en los objetos del modelo pero tengo problemas para encontrar el lugar correcto para hacerlo. ¿Alguna sugerencia?

Respuesta

29

En realidad se puede hacer esto de la siguiente manera:

class BaseMessage(models.Model): 
    is_public = models.BooleanField(default=False) 
    # some more fields... 

    class Meta: 
     abstract = True 

class Message(BaseMessage): 
    # some fields... 
Message._meta.get_field('is_public').default = True 

he hecho esto una o dos veces. Funciona, porque el campo en Message es una instancia diferente del campo en BaseMessage. Sin embargo, dudo que se recomiende ;-) Depende mucho de cómo funcionen actualmente los internos de django, por lo que no hay garantía de que funcione para siempre.

+5

Esto funcionó para mí. En mi caso, estaba anulando el texto de ayuda. Sin embargo, tenía más sentido mover ese código al inicializador, así que tengo: def __init __ (self, * args, ** kwargs): super (MyModelClass, self) .__ init __ (* args, ** kwargs) self._meta.get_field ('mymodelfield'). help_text = self.help_text() – Mark

+3

Intento esto para el atributo "único", pero obtengo esto: 'AttributeError: no se puede establecer el atributo'. – guettli

+4

@guettli Lo mismo aquí. No parece funcionar para configurar 'unique'. Esto está en Django 1.7. –

Cuestiones relacionadas