2012-07-12 13 views
8

sto override del metodo save su uno dei miei modelli:personalizzato risparmiare metodo sul modello - 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] 

Tuttavia, voglio solo correre set_coords() una volta, quando si crea il palo. Questa funzione non dovrebbe essere eseguita quando il modello viene aggiornato.

Come posso realizzare questo? C'è un modo per scoprire se il modello è stato creato o aggiornato?

risposta

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

Può cortesemente dirmi che. Il ritorno dovrebbe essere usato o meno in linea 'super (Post, self) .save (* args, ** kwargs)'. Funziona senza ritorno. –

+0

Perfetto! Ottima risposta. –

4

Penso che il modo corretto per farlo sta usando il segnale 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

Direi che i segnali sono una chiamata migliore per modificare il comportamento dei modelli a cui non abbiamo accesso. Nonostante sia utile in entrambi i casi. ;) –

Problemi correlati