Django save方法的update_fields参数
今天遇到的是 django orm 中 save() 使用上的一些小细节,我们来直接看一下代码
position_obj.line_status = position_status
if line_action == LineRecord.STATUS_UP:
position_obj.is_use = True
position_obj.parent_id = parent_id
else:
position_obj.is_use = False
position_obj.parent_id = None
position_obj.save()
没错,这又是我第一次写的代码,领导看后说这样有一些慢,让使用 update_fields 参数改一下,当时我是满怀信心的答应,其实心里是什么的慌的,因为之前没有接触过,更没有使用过【捂脸】,查百度,查博客,查官方文档,最终算是终于学会了,我们先来看一下官方文档给的解释:
指定哪些字段保存
如果save()
在关键字arguments中传递了字段名称列表 update_fields
,则仅更新该列表中命名的字段。如果只想更新一个对象上的一个或几个字段,则可能需要这样做。阻止数据库中所有模型字段的更新将对性能产生一点好处。例如:
product.name = 'Name changed again'
product.save(update_fields=['name'])
该update_fields
参数可以是任何可迭代的包含字符串的参数。空的update_fields
Iterable将跳过保存。无值将对所有字段执行更新。
指定update_fields
将强制进行更新。
保存通过延迟模型加载(only()
或 defer()
)获取的模型时,只有从数据库加载的字段会被更新。实际上,update_fields
在这种情况下有一个自动装置 。如果您分配或更改任何延迟的字段值,则该字段将被添加到更新的字段中。
可能不太好找,这是地址:https://docs.djangoproject.com/en/3.1/ref/models/instances/ 划到中间靠下位置
在当我们数据库的字段的数量很大的时候,如果直接 save() 确实可能会导致 sql 的执行速度变慢,还有的大佬说:如果同时操作一个 Model 对象,更新不同的字段,后保存的操作会用老的值覆盖掉早点操作的值
来看看修改后的代码
position_obj.line_status = position_status
if line_action == LineRecord.STATUS_UP:
position_obj.is_use = True
position_obj.parent_id = parent_id
else:
position_obj.is_use = False
position_obj.parent_id = None
position_obj.save(update_fields=['is_use', 'parent_id'])