Django 修改数据的两种姿势:先查后改 vs 一行 update
【摘要】 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()
找不到记录会抛DoesNotExist
,filter()
不会。 -
update()
不会触发模型里的save()
信号,有钩子需求请用方式一。
一句话总结
改一条:先找后改再保存;改多条:直接 filter().update()
,两行搞定!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)