Django中更新和新条目的区别

Django中更新和新条目的区别,django,Django,我使用save()方法覆盖models.Model方法,以便在将属性保存到DB中之前对其进行一些操作(例如,发出Google MAPS API调用以获取地址的地理位置) 然而,我不想在每次我通过管理面板更新条目时给谷歌打电话,而只是在我插入新条目时 有什么简单的方法可以做到这一点(而不是在save()方法中对数据库运行查询并检查对象是否已经存在) 梅尔 基本上,使用此功能,您可以检查对象是否存在并运行更新,或者在对象不在数据库中时创建新对象在save()上检查所述对象的主键 诸如此类 仔细阅读

我使用
save()
方法覆盖
models.Model
方法,以便在将属性保存到DB中之前对其进行一些操作(例如,发出Google MAPS API调用以获取地址的地理位置)

然而,我不想在每次我通过管理面板更新条目时给谷歌打电话,而只是在我插入新条目时

有什么简单的方法可以做到这一点(而不是在
save()
方法中对数据库运行查询并检查对象是否已经存在)

梅尔


基本上,使用此功能,您可以检查对象是否存在并运行更新,或者在对象不在数据库中时创建新对象

在save()上检查所述对象的主键

诸如此类

仔细阅读链接,这里有一个问题


编辑:gotchas,阅读注释了解更多gotchas

我相信save()函数中的get_或_create()将创建一个循环。。。我可以使用我在save()中提到的get(),然后检查对象是否存在。我想在save()方法中可能有更好的方法来完成这项工作。首先必须调用get_或_create()。然后,您可以使用布尔值“created”检查对象是否已创建或存在。如果它存在,您可以编辑它,然后根据需要保存()。如果没有,它已经保存。你不需要在save()方法中调用get_或_create,这基本上就是get_或_create的作用。只要检查PK并假设记录就存在,就会给ex带来麻烦。当你尝试加载该模型的夹具时。@samuele这个方法不会进行额外的db调用,AFAIK(仅save)。另外,在我看来,获取或创建视图(业务流程)级别的交易,而不是行级别的交易(因此每次保存前都必须调用它)。不,仅当必须更新对象时。但是,如果您创建了一个必须保存的新对象,如果您修改了一个对象,则必须保存。2个db调用,如get或create。此外,pk字段可以更改(甚至被删除)。Get_或create是一种更安全、更强的方法。@samuele我明白了。询问者希望“而不是在save()方法中对DB运行查询”,但您是对的,使用get\u或\u create更安全
def save(self, *args, **kwargs):
    if self.pk:
        # this is executed when updating (pk exists)
    else:
        # this is executed when inserting
    super(Model, self).save(*args, **kwargs)