当前位置: 首页 > 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.jsqmd.com/news/37644/

相关文章:

  • matlab实现TCM-8PSK的调制解调,跑出误码率曲线
  • 【LVGL】复选框部件
  • 总平方和SST、回归平方和SSR、残差平方和SSE
  • serializers.ModelSerializer进行序列化和反序列化时,只传递instance和只传递data以及同时传递instance和data参数作为序列化输出和反序列化输入的数据源
  • 深入解析:服务注册 / 服务发现 - Eureka
  • 小型skywalking - ukyo-
  • 完整教程:顺序步进频与捷变频雷达:原理、建模与测距方法
  • 完整教程:在 Claude Code 中设置 MCP 服务器(技术总结)
  • Linux使用CentOS 7内核修改镜像源解决“Could not resolve host: mirrorlist.centos.org;未知的错误“问题
  • 艾体宝干货 | Redis Python 开发系列#2 核心数据结构(上)
  • [GXYCTF2019]Ping Ping Ping wp - fish666
  • 2025 年 11 月码垛机厂家推荐排行榜,全自动/高位/低位/立柱/编织袋/纸箱/桶/粉料/肥料码垛机,江苏/无锡码垛机器人实力解析
  • 2025年西瓜专用膜厂家权威推荐榜单:水果专用膜/长寿流滴膜/灌浆膜源头厂家精选
  • 2025 年 11 月包装称厂家权威推荐榜:全自动/定量/FFS重膜/高速/锂电/零排放/螺旋/吨袋包装称,铜精粉与肥料吨包高效解决方案
  • 基于MATLAB图像特征识别及提取实现图像分类
  • Strix:用AI做渗透测试,把安全漏洞扼杀在开发阶段
  • 无限长直导线周围电场分布的MATLAB
  • Codeforces Round 1063 (Div.2) 题解
  • SI502、SI502B——NFC前端芯片
  • 草稿5
  • 1-2-3-泛型与反射
  • 读书笔记:白话解读:Oracle并行加载与空间管理的艺术
  • 1-2-4-集合框架
  • 1-3-1-知识图谱
  • USB --- PD协商
  • T690363 促销活动
  • 1-3-2-线程生命周期与状态转换
  • 1-2-2-异常体系
  • 1-5-1-设计模式与OOP
  • 1-6-0-总纲