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