【问题标题】:custom save method on model - django模型上的自定义保存方法 - django
【发布时间】:2012-07-12 17:03:35
【问题描述】:

我在我的一个模型上覆盖了 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()。更新模型时不应运行此函数。

我怎样才能做到这一点?有什么方法可以检测模型是否正在创建或更新?

【问题讨论】:

    标签: django django-1.4


    【解决方案1】:
    def save(self, *args, **kwargs):
        if not self.pk:
            self.set_coords()
        super(Post, self).save(*args, **kwargs)
    

    【讨论】:

    • 你能告诉我吗。在线super(Post, self).save(*args, **kwargs)应该使用或不使用return。它无需返回即可工作。
    【解决方案2】:

    我认为正确的做法是使用 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)
    

    【讨论】:

    • 我会说信号是一个更好的调用来改变我们无法访问的模型的行为。尽管无论哪种方式都很有用。 ;)
    猜你喜欢
    • 2019-10-18
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2015-02-24
    • 2014-07-11
    相关资源
    最近更新 更多