如何在Python Django中利用Update_fields优化单字段更新的性能?

浅强君_9302

浅强君_9302

2026-07-19

208人浏览

原创

update_fields仅更新已加载字段,不绕过验证但跳过未列字段检查;需确保字段存在于实例中,否则报错或静默失败;批量更新应优先用queryset.update()而非逐条save;auto_now字段需显式列入update_fields才更新;配合defer/only可减少io。

如何在python django中利用update_fields优化单字段更新的性能?

update_fields参数只更新指定字段,但必须是模型实例已加载的字段

直接调用 save(update_fields=['field_name']) 不会跳过字段验证或数据库读取,它只影响 INSERT/UPDATE 语句中 SET 子句的内容。前提是该字段已在当前模型实例中存在(比如你从数据库查出来后改了某个值),否则 Django 会报 ValueError: update_fields must be a list or tuple 或静默忽略未载入的字段。

  • 如果字段没在实例里(例如用 MyModel.objects.create(name='x') 新建后立刻 save(update_fields=['updated_at'])),Django 不知道原始值,也无法生成正确 SQL;更糟的是,某些版本会把未载入字段当作 NULL 写入
  • update_fields 不绕过 clean() 或 pre_save 信号,但跳过其他字段的验证逻辑(如非空检查仅对列出字段生效)
  • 使用前建议先确认字段是否已加载:打印 obj.__dict__ 看对应键是否存在,或用 obj._state.adding 判断是否为新建对象

批量单字段更新别用 save(),改用 QuerySet.update()

对多条记录只改一个字段(比如统一标记 status='processed'),save() + update_fields 是逐行操作,N 条记录触发 N 次查询+信号+事务开销;而 QuerySet.update() 是单条 SQL,不触发模型方法和信号,性能差距可达数量级。

361SCAN security check your skill python scripts
361SCAN security check your skill python scripts

扫描并分析已安装技能,用于查看指定技能目录的名称、描述和详情,或列出所有已安装的技能。

下载
  • 正确写法:MyModel.objects.filter(id__in=[1,2,3]).update(status='done')
  • 错误写法:循环每个对象 obj.status = 'done'; obj.save(update_fields=['status'])
  • QuerySet.update() 返回受影响行数(int),不是模型实例,无法链式调用 .select_related() 等
  • 注意:它不调用 save(),所以 auto_now、auto_now_add 字段不会自动更新,需显式传入,如 updated_at=timezone.now()

datetime auto_now 字段更新时 update_fields 容易漏掉 updated_at

很多模型定义了 updated_at = models.DateTimeField(auto_now=True),但开发者常只写 obj.name = 'new'; obj.save(update_fields=['name']),结果 updated_at 没变——因为 auto_now 是在 save() 内部靠字段属性拦截实现的,update_fields 会阻止该逻辑执行。

  • 必须手动加入:obj.save(update_fields=['name', 'updated_at'])
  • 或者改用 auto_now_add=False + 在视图/服务层显式赋值:obj.updated_at = timezone.now(),再用 update_fields
  • Django 4.2+ 支持 auto_now 与 update_fields 共存,但前提是字段名明确列出,否则仍不更新

update_fields 和 select_related / defer 配合才能真正省 IO

update_fields 本身不减少查询次数,它只减少 UPDATE 语句的字段数。真正省 DB IO 的关键是:先用 defer() 或 only() 加载最少必要字段,再修改并保存。

  • 例如只更新状态:obj = MyModel.objects.defer('description', 'content').get(id=1),此时 obj.__dict__ 里没有被 defer 的字段,save(update_fields=['status']) 就不会意外把 NULL 写进大字段
  • 反过来,如果用了 select_related() 却没在 update_fields 里排除外键字段,Django 可能因外键缓存状态异常报 ValueError: Cannot force an update in save() with no primary key
  • 调试技巧:开启 LOGGING 中的 django.db.backends,看生成的 SQL 是否真只含指定字段
实际用的时候,update_fields 不是开关一开就快,它依赖你对数据加载路径和字段状态的精确控制;漏掉一个 updated_at 或误 defer 了关键字段,反而导致数据错乱。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

python django python安装

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4624

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1749

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

27277

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3287

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3307

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2563

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习