2012-07-12 13 views
8

estoy reemplazando el método ahorrar en una de mis modelos:reserva de la aduana método en el modelo - django

def save(self, *args, **kwargs): 
    self.set_coords() 
    super(Post, self).save(*args, **kwargs) 

def __unicode__(self): 
    return self.address 

# set coordinates 
def set_coords(self): 
    toFind = self.address + ', ' + self.city + ', ' + \ 
     self.province + ', ' + self.postal 

    (place, location) = g.geocode(toFind) 

    self.lat = location[0] 
    self.lng = location[1] 

Sin embargo, sólo quiero correr set_coords() una vez, cuando se creó el cargo. Esta función no debería ejecutarse cuando el modelo se está actualizando.

¿Cómo puedo lograr esto? ¿Hay alguna forma de detectar si el modelo se está creando o actualizando?

Respuesta

24
def save(self, *args, **kwargs): 
    if not self.pk: 
     self.set_coords() 
    super(Post, self).save(*args, **kwargs) 
+0

¿Puede usted por favor decirme eso. Return debería usarse o no en la línea 'super (Post, self) .save (* args, ** kwargs)'. Funciona sin retorno. –

+0

¡Perfecto! Muy buena respuesta. –

4

creo que la forma correcta de hacerlo es usando la señal post_save:

def set_coords(sender, **kw): 
    model_instance = kw["instance"] 
    if kw["created"]: 
     toFind = model_instance.address + ', ' + model_instance.city + ', ' + \ 
     model_instance.province + ', ' + model_instance.postal 
     (place, location) = g.geocode(toFind) 
     model_instance.lat = location[0] 
     model_instance.lng = location[1] 
     model_instance.save() 
post_save.connect(set_coords, sender=MyModel) 
+0

Yo diría que las señales son una mejor llamada a cambiar el comportamiento de los modelos que no tenemos acceso. A pesar de ser útil de cualquier manera. ;) –

Cuestiones relacionadas