Django 修改数据的两种姿势:先查后改 vs 一行 update

举报
周杰伦本人 发表于 2025/08/31 20:07:53 2025/08/31
【摘要】 Django 修改数据的两种姿势:先查后改 vs 一行 update场景:把 id=6 的书名从「测试开发入门」改成「爬虫入门」,再把评论数调成 666。 方式一:先拿到对象,再改属性# 1. 把书找出来(等同于 SELECT * FROM bookinfo WHERE id=6)book = BookInfo.objects.get(id=6)# 2. 直接改内存里的属性book.nam...

Django 修改数据的两种姿势:先查后改 vs 一行 update

场景:把 id=6 的书名从「测试开发入门」改成「爬虫入门」,再把评论数调成 666。


方式一:先拿到对象,再改属性

# 1. 把书找出来(等同于 SELECT * FROM bookinfo WHERE id=6)
book = BookInfo.objects.get(id=6)

# 2. 直接改内存里的属性
book.name = '爬虫入门'

# 3. 手动保存(真正执行 UPDATE)
book.save()
  • 优点:直观,适合只改一条记录。

  • 注意:一定要 save(),否则只在内存里变,数据库纹丝不动。


方式二:直接批量更新

# 相当于 UPDATE bookinfo SET name='爬虫入门', comment_cnt=666 WHERE id=6
rows = BookInfo.objects.filter(id=6).update(
    name='爬虫入门',
    comment_cnt=666
)
print(rows)   # 1  表示影响 1
  • 优点:一条语句改完,不需要 save(),效率高。

  • 注意filter() 返回的是 QuerySet,后面只能接 update()不能接 get()update()


选哪个?

需求 推荐写法
只改一条,先取出来再做点别的逻辑 方式一(对象.save)
批量改多条,或只想改几个字段 方式二(filter().update)

记住一句口诀:

对象.save 要手动,QuerySet.update 全自动。


小坑提醒

  • get() 找不到记录会抛 DoesNotExistfilter() 不会。

  • update() 不会触发模型里的 save() 信号,有钩子需求请用方式一。


一句话总结

改一条:先找后改再保存;改多条:直接 filter().update(),两行搞定!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。