2012-03-15 106 views
5

我可以或應該在視圖中執行此操作嗎?在Django中動態更改QuerySet對象

a = SomeTable.objects.all() 
for r in a: 
    if r.some_column == 'foo': 
     r.some_column = 'bar' 

它像一個冠軍,但我想類似的事情別的地方,我得到了奇怪的結果,這意味着QuerySet的對象不喜歡惹的。而且,我沒有看到文檔中的任何內容對於這種技巧的好壞。

我知道還有其他的方法可以做到這一點,但我特別想知道這是一個壞主意,爲什麼它不好,如果它確實很糟糕,那麼'最好'的最Django/pythonic方式在飛行中改變價值將是。

回答

6

這很好,只要你以後不做任何事情會導致查詢集重新評估 - 例如,切片。這將對數據庫進行另一次查詢,並且所有修改的對象都將被新的數據庫替換。

保護自己免受這將是轉換到一個列表第一種方法:

a = list(SomeTable.objects.all()) 

通過這種方式,進一步切片等不會造成新的數據庫調用,任何修改將被保留。

+0

謝謝Daniel。當我說「我知道還有其他方法可以做到這一點」時,您的示例正是我的意思,我也很感謝您的澄清。哦,你的分片例子正是我提到的奇怪結果。我有點尷尬,我沒有聽清楚,我很高興你指出了這一點。乾杯! – proffrink 2012-03-15 11:56:31

0

是。看文檔here

SomeTable.objects.filter(some_column='foo').update(some_column='bar') 

我會用Django的成語去。它使用'where'和'update'的單個語句執行SQL,而不是像您的代碼那樣發送多個SQL語句。這節省了時間。檢查Django的'connection'以測試SQL時間。

+4

謝謝,我很抱歉,如果我不清楚,但我不想更新數據庫,只是修改輸出的顯示目的。 – proffrink 2012-03-15 11:54:23