2012-08-05 16 views
8

Digamos que tengo una clase llamada Hero con un campo llamado "nombre". Cada vez que se crea un nuevo objeto Hero, quiero agregar " is a hero". ¿Puedo usar __init__ para eso? ¿O hay un método específico de django que puedo anular para eso?modelo django en create use __init__?

class Hero(modes.Model) 
    name = models.CharField(max_length=100) 
    def __init__(self, *args, **kwargs): 
     name += " is a hero" 
     super(Hero, self).__init__(*args, **kwargs) 
+1

Esto casi nunca es lo que quiere. Describe tu problema real. –

+0

@ IgnacioVazquez-Abrams Tengo que actualizar otro modelo que se basa en la entrada agregada de mi clase 'Hero'. – Joey

+1

@Joey Use [signals] (https://docs.djangoproject.com/en/1.4/topics/signals/) en su lugar. – Dougal

Respuesta

15

Si por "cada vez que se crea un nuevo objeto héroe" que quiere decir "cada vez que un registro héroe se crea en la base de datos," pues no, usted no quiere hacer esto en el método __init__, ya que se llama en cualquier momento que se crea un objeto Hero en Python, incluso cuando acaba de obtener un registro existente de la base de datos.

para hacer lo que desea, puede utilizar Django post_save signal, comprobando en la devolución de llamada señal de que el parámetro created palabra clave es verdadera y la realización de la lógica "en la creación" de ser así.

Alternativamente, y más sencillo y natural en ciertos casos, puede anular el método de héroe save() de la siguiente manera:

def save(self, *args, **kwargs): 
    if not self.pk: # object is being created, thus no primary key field yet 
     self.name += " is a hero" 
    super(Hero, self).save(*args, **kwargs) 

Tenga en cuenta que el método de Djagno bulk_create saltará activación o bien la señal post-guardar o llamando save.

+4

Como [los documentos explican] (https://docs.djangoproject.com/en/1.4/topics/db/models/#overriding-model-methods), siempre debe incluir '* args' y' ** kwargs' en la llamada al método 'save' de la clase padre, * ie *' super (Hero, self) .save (* args, ** kwargs) '. La razón de esto es a prueba de futuro contra cambios (en Django, o su código) a la firma del método 'save()'. – supervacuo

+1

@supervacuo - buena captura, he editado eso, gracias. – Ghopper21

+1

Como una advertencia para lectores futuros, anular 'guardar' no es universalmente seguro. [Batch saves no invocará métodos de guardado sobrecargados ni invocará las señales 'post_save' y' pre_save'] (https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods). No estoy seguro de si Django ofrece alguna forma de personalizar la actualización o creación masiva, aunque no lo parezca, por lo que debe tener cuidado con la forma de hacerlo y asegurarse de que no se realicen las copias masivas si defiende en el comportamiento de actualización personalizada. – Taywee