13

モデルの 1 つで save メソッドをオーバーライドしています。

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()ただし、投稿が作成されているときに一度だけ実行したいです。モデルの更新中は、この関数を実行しないでください。

どうすればこれを達成できますか? モデルが作成されているか更新されているかを検出する方法はありますか?

4

2 に答える 2

33
def save(self, *args, **kwargs):
    if not self.pk:
        self.set_coords()
    super(Post, self).save(*args, **kwargs)
于 2012-07-12T17:05:40.513 に答える
3

それを行う正しい方法は、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)
于 2012-07-12T17:36:13.680 に答える