Django中如何将待删除的表行数据留存到变量中?
问题描述
我需要删除表中所有行,但希望先存储旧数据,以便在新旧数据间执行相关操作。尝试了以下代码:
old_data = Rc.object.all() Rc.object.all().delete() # 现在我获取API数据并执行表的保存操作
但发现old_data中的数据会被更新为新数据。为测试这一情况,执行了如下代码:
for rows in old_data: check = Rc.object.filter(Q(id=rows.id)&Q(modified_date__gt=rows.modified_date)).exists() print(check)
结果check始终为false(表中存在对应id的行),但在old_data = Rc.object.all()后立即打印old_data时,数据仍为旧数据(此时check为true)。
我是否忽略了什么?如何将所有行数据存储到变量后再删除表行?
解决方案
问题出在Django ORM的QuerySet惰性求值特性上:
Rc.object.all()并没有立即从数据库加载数据,它只是生成了一个待执行的查询语句。只有当你实际遍历、打印或对QuerySet进行其他需要数据的操作时,才会真正执行数据库查询。- 你先执行了
Rc.object.all().delete()删除旧数据,之后又插入了新数据。当后续遍历old_data时,QuerySet才会重新执行查询,此时数据库里已经是新数据了,所以old_data拿到的是更新后的数据。
解决方法很简单,把QuerySet转换成内存中的列表,强制立即加载所有旧数据:
old_data = list(Rc.object.all()) # 用list()包裹,立即执行查询并加载数据到内存 Rc.object.all().delete() # 后续获取API数据并保存的逻辑不变
这样old_data就是存储在内存中的静态列表,后续数据库的任何变化都不会影响它,你可以放心地用它来和新数据做对比操作。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

