2012-07-12 7 views
8

Je redéfinissant la méthode des économies sur l'un de mes modèles:méthode save personnalisé sur le modèle - 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] 

Cependant, je veux seulement courir une fois set_coords(), lorsque le poste est en cours de création. Cette fonction ne doit pas s'exécuter lors de la mise à jour du modèle.

Comment puis-je accomplir ceci? Existe-t-il un moyen de détecter si le modèle est créé ou mis à jour?

Répondre

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

Pouvez-vous s'il vous plaît me dire. Le retour doit être utilisé ou non en ligne 'super (Post, self) .save (* args, ** kwargs)'. Cela fonctionne sans retour. –

+0

Parfait! Très bonne réponse –

4

Je pense que la bonne façon de le faire est d'utiliser le signal 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

Je dirais que les signaux sont un meilleur appel pour changer le comportement des modèles auxquels nous n'avons pas accès. En dépit d'être utile de toute façon. ;) –

Questions connexes