2012-07-12 13 views
8

ich die Methode speichern auf einem meiner Modelle bin überschreiben:benutzerdefinierte Methode auf Modell speichern - 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] 

Allerdings möchte ich nur set_coords() einmal ausgeführt, wenn die Post erstellt wird. Diese Funktion sollte nicht ausgeführt werden, wenn das Modell aktualisiert wird.

Wie kann ich das erreichen? Gibt es eine Möglichkeit festzustellen, ob das Modell erstellt oder aktualisiert wird?

Antwort

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

Können Sie mir bitte sagen. Return sollte verwendet werden oder nicht in der Zeile 'super (Post, self) .save (* args, ** kwargs)'. Es funktioniert ohne Rückkehr. –

+0

Perfekt! Sehr gute Antwort. –

4

denke ich, der richtige Weg, es zu tun post_save Signal verwendet:

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

Ich würde sagen, dass Signale ein besserer Aufruf sind, das Verhalten von Modellen zu ändern, auf die wir keinen Zugriff haben. Obwohl es in beiden Fällen nützlich ist. ;) –

Verwandte Themen