3

如果我从数据库中获取所有对象,然后使用 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?

是否可以立即刷新每个客户的每次迭代中的值?因此,在处理 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      
4

2 回答 2

1

这是摘自文档的摘录:

Model.delete([using=DEFAULT_DB_ALIAS]) 为对象发出 SQL DELETE。这只会删除数据库中的对象;Python 实例仍将存在,并且其字段中仍将包含数据。

有关更多详细信息,包括如何批量删除对象,请参阅删除对象。

如果您想要自定义删除行为,您可以覆盖 delete() 方法。有关更多详细信息,请参阅覆盖预定义的模型方法。

我不明白为什么你会在第一个循环中嵌套第二个循环:对于每个对象,删除所有对象然后保存对象?

cust = Customer.objects.all():

#delete all
for c in Customer.objects.all():
   c.delete()

这更清楚,恕我直言。我会尝试解释应该发生什么(不是 100% 肯定,从未尝试过这样的事情)。

  • cust 是一个 QueryDict 对象,正如文档所说,它仍然填充
  • 您的数据库现在已清空与客户模型相关的所有数据

您现在应该能够遍历 cust 并再次保存每个对象。

注意应该,这很重要

于 2013-03-14T18:14:08.827 回答
0

cust变量包含有关存储在 QuerySet 中的第 n 个元素的信息的 python 表示形式(由 Customer.objects.all() 获得)。

如果您调用 delete() 方法,您会点击数据库,但有关已删除对象的所有信息仍存储在cust变量中。因此,如果您在删除此方法的 save() 方法后调用,您将在数据库中重新存储变量中包含的所有信息。

于 2013-03-14T18:18:30.150 回答