2014-08-27 42 views
2

爲了澄清,我有幾千個屬性項目,每個都有一個'present'字段(等等)。要重置系統以再次使用,我需要將每個項目的「屬性」字段設置爲false。現在,當然還有最簡單的方式做到這一點,這就是:如何快速設置一個Django模型的所有實例的字段?

for obj in Property.objects.all(): 
    obj.present = False 
    obj.save() 

但是,這需要近30秒我的開發服務器上。我覺得必須有一個更好的辦法,所以我試圖用限制Django的only查詢集加載的字段:

for obj in Property.objects.only('present'): 
    obj.present = False 
    obj.save() 

無論出於何種原因,這其實需要更長剛開整個對象。

因爲我需要將所有這些值不加區分地設置爲False,有沒有更快的方法?除了'go do it'命令之外,這個函數沒有用戶輸入,所以我覺得一個原生的SQL命令是一個安全的選擇,但我不知道SQL足以起草這樣的命令。

謝謝大家。

+0

如何更新? 'Property.objects.all()。update(present = False)' – karthikr 2014-08-27 17:50:29

回答

4

使用update查詢:

Property.objects.all().update(present=False) 

注意update()查詢在SQL級上運行,所以如果你的模型有一個自定義的save()方法則是不會就在這裏調用。在這種情況下,您正在使用的正常的for-loop版本是要走的路。

+0

8秒。這真是太棒了。非常感謝你!編輯:跳板,將其更改爲Property.objects.filter(present = True).update(present = False)將其降至6.5-7秒。好東西! – Chance 2014-08-27 17:56:32

相關問題