django的`save()`是否创建或更新?

时间:2019-08-12 10:10:22

标签: python django

文档只是说

  

要将对象保存回数据库,请调用save()

不清楚。实验发现,如果包含Logger log = LoggerFactory.getLogger(getClass()); ,它将更新现有条目,而如果不包含,则会创建新行。该文档是否指定会发生什么情况?

2 个答案:

答案 0 :(得分:2)

这里有很多记录:

https://docs.djangoproject.com/en/2.2/ref/models/instances/#how-django-knows-to-update-vs-insert

  

您可能已经注意到Django数据库对象使用相同的save()   创建和更改对象的方法。 Django提取了   使用INSERT或UPDATE SQL语句。具体来说,当您致电   save(),Django遵循以下算法:

     

如果对象的主键属性设置为可评估的值   改为True(即,无或空字符串以外的值),Django   执行一个UPDATE。如果未设置对象的主键属性   或UPDATE没有更新任何内容(例如,如果主键设置为   一个数据库中不存在的值),Django执行   插入。这里的一个陷阱是,您应注意不要   如果保存新对象,则明确指定主键值   无法保证主键值未使用。有关此的更多信息   细微差别,请参阅上面明确指定自动主键值和   在下面强制执行INSERT或UPDATE。

请注意:django是OSS,因此有疑问时,您始终可以阅读源代码;-)

答案 1 :(得分:-1)

取决于Model对象的创建方式。如果是从数据库中查询的,则为UPDATE。如果它是一个新对象并且之前没有保存过,请INSERT