当前位置: 首页 > news >正文

django orm save方法的坑

背景:

django项目开发时,经常会使用obj.save()命令,用来保存数据。但是并没有认证的研究过save方法到底做了什么事情。

出现的问题:
页面操作删除当前页面的100条数据后,操作成功,此时数据库的数据也删除了。但是在这个时候有一个定时任务也在处理这个页面的数据。

大致流程如下

1. 页面操作
orm查出需要删除的数据。执行.delete()方法。此时数据库的数据也被成功删除了
2. 此时的定时任务
for obj in queryset:  # 数据较多100条做业务操作,时间较长1-2秒obj.save()  # 保存数据3. 等待几分钟后,发现页面上能又能看到之前删除的数据了。

分析原因

save方法其实是有几个参数的
def save(self,force_insert=False, force_update=False, using=None, update_fields=None)如果你在执行save的时候不传递参数,save方法会先执行update(sql),如果此时此数据不存在(你的obj一定是有pk的),update会返回0,save方法会再执行一次insert(sql)方法。所以在你执行delete之前,这些数据如果被读到内存中,并且正在for循环的处理数据。那在执行到obj.save()时,会把已经被删除的数据重新恢复。

解决方法

1. (推荐)传入force_update=True参数,这个参数传入后,save在执行update(sql)之后,如果返回0,会报错,不回去执行insert方法
2. 执行save前,先查询。

 

http://www.gsyq.cn/news/46603.html

相关文章:

  • AI学习之路
  • 2025年西瓜专用膜厂家权威推荐榜单:水果专用膜/长寿流滴膜/灌浆膜源头厂家精选
  • Strix:用AI做渗透测试,把安全漏洞扼杀在开发阶段
  • Codeforces Round 1063 (Div.2) 题解
  • SI502、SI502B——NFC前端芯片
  • 草稿5
  • 读书笔记:白话解读:Oracle并行加载与空间管理的艺术
  • 1-2-4-集合框架
  • USB --- PD协商
  • 1-5-1-设计模式与OOP
  • 1-6-2-网络协议基础
  • Debug日志
  • 1-6-5-Netty
  • 2025年11月北京离婚房产律师对比榜:五强机构多维评测
  • 3-1-2-1-MySQL整体架构详解
  • 3-1-2-3-MySQL高可用与容灾
  • AT AGC043D Merge Triplets 题解
  • 关于CSS的三种引入方法的说明与区别说明
  • C# Avalonia 17- ControlTemplates - VisualTreeDisplay
  • Q:访问url地址,nginx报错 403 Forbidden
  • 领嵌iLeadE-588智能网关设备接入云平台
  • 【MySQL】事务 - 详解
  • 2025年井式炉直销厂家权威推荐榜单:节能工业炉/退火井式炉/大型井式炉源头厂家精选
  • 2025年防爆加热管优质厂家权威推荐榜单:防爆电加热棒/防爆电热管/防爆电加热管源头厂家精选。
  • 详细介绍:【NestJS】NestJS三件套:校验、转换与文档生成,对比Django DRF
  • uni-app iOS日志管理实战,从调试控制台到系统日志的全链路采集与分析指南
  • 2025年优秀的列管式换热器厂家推荐及采购参考
  • 2025 年 11 月配电柜/配电箱/开关柜厂家推荐排行榜,智能配电系统,高低压配电柜,动力配电箱,户外配电箱公司推荐
  • 2025年杭州汽修门店接单App服务商权威推荐榜单:汽车改装服务/汽车改装平台/汽修门店接单工具源头服务商精选
  • 三场比赛(e)