django 的 save() 是创建还是更新?

blu*_*ote 1 python django

文档只是说

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

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

bru*_*ers 5

此处有完整记录:

\n\n

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

\n\n
\n

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

\n\n

如果对象\xe2\x80\x99s 主键属性设置为计算结果\n 为True 的值(即除None 或空字符串之外的值),Django\n 将执行更新。如果未设置对象\xe2\x80\x99s 主键属性\n或者更新未\xe2\x80\x99t 更新任何内容(例如,如果主键设置为\n不存在\xe2\x80\x99t 的值在数据库中),Django 执行\n INSERT。这里的一个问题是,如果您不能保证主键值未被使用,那么在保存新对象时,您应该小心不要显式指定主键值。有关此细微差别的更多信息,请参阅上面的显式指定自动主键值和下面的强制插入或更新。

\n
\n\n

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

\n

  • 此行为在 Django 3 中似乎已更改:https://docs.djangoproject.com/en/4.0/releases/3.0/#model-save-when-providing-a-default-for-the-primary-key (3认同)