首页 > 解决方案 > django 的`save()` 是创建还是更新?

问题描述

文档只是说

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

这并不清楚。实验时,我发现如果我包含一个id,它会更新现有条目,而如果我不包含,它会创建一个新行。文档是否说明会发生什么?

标签: pythondjango

解决方案


这里有完整的记录:

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 的值(即,非 None 或空字符串的值),Django 执行 UPDATE。如果对象的主键属性没有设置或者 UPDATE 没有更新任何东西(例如,如果主键设置为数据库中不存在的值),Django 执行 INSERT。这里的一个问题是,如果您不能保证主键值未被使用,则在保存新对象时应注意不要显式指定主键值。有关此细微差别的更多信息,请参阅上面的显式指定自动主键值和下面的强制插入或更新。

附带说明:django 是 OSS,所以当您有疑问时,您可以随时阅读源代码 ;-)


推荐阅读