2012-07-12 25 views
8

Jestem przesłanianie metody zapisywania na jednym z moich modeli:niestandardowy sposób zaoszczędzić na modelu - 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] 

Jednak ja tylko chce uruchomić set_coords() raz, gdy poczta jest tworzona. Ta funkcja nie powinna działać, gdy model jest aktualizowany.

Jak mogę to zrobić? Czy istnieje sposób na wykrycie, czy model jest tworzony lub aktualizowany?

Odpowiedz

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

Czy możesz mi powiedzieć, że. Zwrot powinien być użyty lub nie w linii 'super (Post, self) .save (* args, ** kwargs)'. Działa bez powrotu. –

+0

Idealny! Bardzo dobra odpowiedź. –

4

myślę poprawny sposób to zrobić jest użycie sygnału 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

Powiedziałbym, że sygnały są lepszym wezwaniem do zmiany zachowania modeli, do których nie mamy dostępu. Pomimo tego, że jest przydatny w każdy sposób. ;) –

Powiązane problemy