2013-03-14 28 views
2

如果我從數據庫中獲取所有對象,然後使用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

這是來自the docs採取的摘錄:

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%肯定,從來沒有嘗試過這樣的事情)。

  • 卡斯特是一個的QueryDict對象,並作爲文檔說,它仍然populted
  • 您的數據庫現在已經清空所有與客戶型號

您現在應該能夠將數據迭代cust並將每個對象再次保存回去。

心的應該,這是非常重要的

+0

我添加了第二個示例 – siamii 2013-03-14 18:49:44

+0

不介意,cust2和cust是客戶的兩個不同副本,它們都包含相同的數據,最後保存cust會將其值返回到db中。你的cust2循環只是從數據庫中刪除數據,但最外面的Customer循環存儲了一個包含數據庫初始值的臨時查詢集。它不介意如果你的內部循環全部刪除它們,Customer.objects.all()仍然包含原始值 – 2013-03-15 10:48:12

+1

我想避免此同步錯誤的唯一解決方案是在循環開始時手動刷新每個Cust。像'cust = cust.refresh()' – siamii 2013-03-15 13:22:49

0

cust變量包含關於存儲在查詢集的第n個元素(()由Customer.objects.all獲得)的信息的一個Python表示。

如果您調用delete()方法,則會彈出數據庫,但所有有關已刪除對象的信息仍將存儲在cust變量中。因此,如果在刪除save()方法後調用,則可以在DB中重新存儲變量中包含的所有信息。

相關問題