django - imageField.save() 和 add() 是否将整个模型保存在 django 中?
问题描述
我刚刚体验到,我的model.save()
命令是不必要的,因为显然这已经由image.save()
并且也完成了childs.add()
model = Model()
child = Child()
model.name = 'Test'
model.image.save(file)
model.childs.add(child)
model.save() # is not necessary
通常这甚至不适用于新条目,因为添加功能在没有 pk 的情况下将无法工作。但看起来该image.save()
方法不仅移动/上传了图像文件,而且还将整个模型保存到了数据库中。似乎也是如此childs.add()
,因为此信息也无需调用即可更新model.save()
。
我一直认为,更新数据库只有在调用时才进行model.save()
,显然我错了,或者我的错误在哪里?
解决方案
这是有据可查的。文档中甚至还有一个突出显示的警告。
警告
该类的两个方法save()和delete(),默认将关联的FieldFile的模型对象保存在数据库中。
默认情况下FileField.save()
(ImageField 继承自)会将文件保存到文件存储和模型实例。这保证了数据库的状态和文件存储的状态是一致的。save=False
您可以通过在方法中使用命名参数来覆盖它FileField.save()
。
RelatedManager.add()
不保存您的模型实例。但它会更新数据库中的关系,该关系在另一个模型中表示为外键或中间连接表。如果您对实例中的其他字段进行了更改,则必须使用save()
来保留这些更改。
推荐阅读
- python - 是否有一个函数可以帮助我将 (x) 拆分为一个字符串,每个拆分都包含第 (x+1) 个值?
- java - 如何在异步任务的 for 循环中更新列表视图
- android - windowBackground 上的居中图像与膨胀布局上的图像不同
- python - 无法从 __init__ 导入属性
- python - 施加约束时问题不遵循 DCP 规则
- mysql - 为什么 Google Cloud SQL 中的 COUNT 有时会这么慢?
- google-app-maker - 如何使用计算模型将数据保存到 REST API
- playframework - 一个灵活的扩展方法的多对多版本
- javascript - 在被测函数内部创建的对象上模拟 jQuery 方法调用
- c++ - 我访问的是什么错误的内存导致分段错误?