首页 > 解决方案 > 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(),显然我错了,或者我的错误在哪里?

标签: djangomodel

解决方案


这是有据可查的。文档中甚至还有一个突出显示的警告。

警告

该类的两个方法save()和delete(),默认将关联的FieldFile的模型对象保存在数据库中。

默认情况下FileField.save()(ImageField 继承自)会将文件保存到文件存储和模型实例。这保证了数据库的状态和文件存储的状态是一致的。save=False您可以通过在方法中使用命名参数来覆盖它FileField.save()

RelatedManager.add()不保存您的模型实例。但它会更新数据库中的关系,该关系在另一个模型中表示为外键或中间连接表。如果您对实例中的其他字段进行了更改,则必须使用save()来保留这些更改。


推荐阅读