如果我从数据库中获取所有对象,然后使用python foreach循环遍历它们,然后在循环中删除所有这些对象。作为客户对象
仍在内存中的已删除数据库条目会发生什么情况for cust in Customer.objects.all():
#delete all
for cust2 in Customer.objects.all():
cust2.delete()
#what is cust now??
cust.save() # is this valid?
是否可以立即刷新每个cust的每次迭代中的值?因此,在处理cust1时,我删除了cust2,然后在下一次迭代中我没有开始处理cust2 ...想象一下:
for cust in Customer.objects.all():
if cust.pay_everyone():
for cust2 in Customer.objects.all():
cust2.paid = True
cust2.save()
#when cust2 comes in the loop, cust2.paid is still False
#the previous pay_everyone() method is undone
if cust.kill_everyone():
for cust2 in Customer.objects.all():
cust2.delete()
#when cust2 comes in the loop, he is still alive when he should be dead
cust.save()
# in cust2's turn in the loop, he has been just resurrected which is not possible
答案 0 :(得分:0)
这是摘录自the docs:
Model.delete([使用= DEFAULT_DB_ALIAS]) 为该对象发出SQL DELETE。这只删除数据库中的对象; Python实例仍然存在,并且仍然会在其字段中包含数据。
有关详细信息,包括如何批量删除对象,请参阅删除对象。
如果您想要自定义删除行为,可以覆盖delete()方法。有关更多详细信息,请参阅覆盖预定义模型方法。
我不明白为什么你会在第一个循环中嵌套第二个循环:对于每个对象,删除所有对象然后保存对象?
cust = Customer.objects.all():
#delete all
for c in Customer.objects.all():
c.delete()
这是更清楚的,imho。我会尝试解释应该发生什么(不是100%肯定,从未尝试过类似的东西)。
您现在应该能够遍历cust并再次保存每个对象。
注意应该,这是非常重要的
答案 1 :(得分:0)
cust
变量包含有关存储在QuerySet中的第n个元素的信息的python表示(由Customer.objects.all()获取)。
如果您调用delete()方法,则会点击数据库,但有关已删除对象的所有信息仍存储在cust
变量中。因此,如果在删除save()方法之后调用,则会在DB中重新存储变量中包含的所有信息。