2013-06-05 41 views
0

我有這樣一個模型:動態更新的查詢集?

class M(models.Model): 
    ... 
    seen = models.BooleanField() 
    ... 

    def set_seen(self): 
     self.seen = True 
     self.save() 

然後,我有這樣的代碼在views.py功能:

m_not_seen = M.objects.filter(seen=False) 
m_seen = M.objects.filter(seen=True) 

for m in m_not_seen: 
    m.set_seen() 

執行最後一行之後,好像m_seen自動更新到包括之前「未見過」的所有條目。我不希望查詢集被更新。這可能嗎?

回答

4

Django的查詢集懶惰,因爲documentation說:

在內部,一個QuerySet可以被構造,過濾,切片,一般通過周圍居然沒有命中數據庫。除非您執行某些操作來評估查詢集,否則不會實際發生數據庫活動。

在你的情況下,編寫m_seen = M.objects.filter(seen=True)不會進入數據庫,直到你開始循環它或任何你最終使用它。那時,未見的人已經更新了。

文檔繼續討論pickling以及其他可以強制QuerySet進行評估的方法。在你的情況下,你可能只想在QuerySet上調用list(),只是要知道這會將所有結果加載到內存中。

+0

謝謝!你知道list()是否是強制評估最便宜的方法嗎?也許len()更便宜? – averageman

+1

這是相同的成本,因爲你的電話是過濾器。如果你只想計數,你應該使用filter()。count() –