Django save方法的update_fields

Posted Jason_WangYing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django save方法的update_fields相关的知识,希望对你有一定的参考价值。

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_fieldsIterable将跳过保存。无值将对所有字段执行更新。

指定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'])

以上是关于Django save方法的update_fields的主要内容,如果未能解决你的问题,请参考以下文章

为啥 django ORM 的`save` 方法不返回保存的对象?

Django创建对象的create和save方法

在 django 模型自定义 save() 方法中,你应该如何识别一个新对象?

Django模型操作常用方法

django 一对多的添加记录create 和save 方法,update 更新和save()方法的区别,查询API的方法

在 Django 中一次提交中执行多个 save() 的最佳方法