2012-07-12 33 views
8

我重寫方法保存在我的車型之一:自定義保存法對模型 - 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] 

不過,我只是想運行set_coords()一次,正在創建的帖子的時候。更新模型時,此功能不應運行。

我該如何做到這一點?是否有任何方法檢測模型是否正在創建或更新?

回答

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

能否請你告訴我。返回值應該用在'super(Post,self).save(* args,** kwargs)'行上。它的工作沒有回報。 – 2014-10-12 13:15:28

+0

完美!非常好的答案。 – 2015-08-14 05:53:46

4

我認爲這樣做的正確方法是使用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

我想說,信號是改變我們無法訪問的模型行爲的更好的呼叫。儘管兩種方式都有用。 ;) – 2017-01-11 23:01:30