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前,先查询。

 

posted @ 2025-11-11 15:48  10132714  阅读(6)  评论(0)    收藏  举报