python - django 的`save()` 是创建还是更新?
问题描述
文档只是说
要将对象保存回数据库,请调用 save()
这并不清楚。实验时,我发现如果我包含一个id
,它会更新现有条目,而如果我不包含,它会创建一个新行。文档是否说明会发生什么?
解决方案
这里有完整的记录:
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,所以当您有疑问时,您可以随时阅读源代码 ;-)
推荐阅读
- android - Livedata 数据变化模式
- python - Django Signals - 在模型创建时创建文件夹
- javascript - jQuery $(this).data() 返回未定义
- php - 作曲家在linux上给出openssl错误消息php7
- html - 如何在使用flutter_html插件的flutter中自定义UL > LI
- flutter - 颤振条子列表标签栏底部溢出错误
- c - 实现一个 C 函数,该函数在给定字符上拆分字符串并在拆分后返回字符串数组(以及数组长度)
- django - 在django中创建帐户后无法登录
- python - 检查一列中的任何字符串是否与另一列中的任何字符串匹配
- wpf - 添加自定义组合框滚动条样式 wpf