2014-08-27 3 views
2

Чтобы уточнить, у меня есть несколько тысяч объектов Property, каждый из которых имеет поле «настоящее» (среди прочих). Чтобы снова сбросить систему для использования, мне нужно установить поле «свойство» каждого элемента в значение false. Теперь, конечно, есть простой способ сделать это, который просто:Как быстро установить поле всех экземпляров модели Django сразу?

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

Но это занимает около 30 секунд на моем сервере развития. Я чувствую, что должна быть лучшим способом, поэтому я попытался ограничениями загруженных полей, используя only QuerySet Джанго:

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

По какой-то причине, это на самом деле занимает больше, чем просто получить весь объект.

Поскольку мне нужно без разбора установить все эти значения в False, есть ли более быстрый способ? Эта функция не принимает никакого ввода пользователя, кроме команды «идти делать это», поэтому я считаю, что команда на основе SQL будет безопасной, но я не знаю SQL достаточно для создания такой команды.

Спасибо всем.

+0

Как насчет обновления? 'Property.objects.all(). Update (present = False)' – karthikr

ответ

4

Используйте update запрос:

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

Обратите внимание, что update() запрос выполняется на уровне SQL, так что если ваша модель имеет метод пользовательского save(), то он не будет называться здесь. В этом случае обычная версия для цикла, которую вы используете, - это путь.

+0

8 секунд. Это довольно здорово. Большое спасибо! EDIT: Чтобы отключить этот трафик, изменив его на Property.objects.filter (present = True) .update (present = False), снизил его до 6,5-7 секунд. Качественный товар! – Chance

Смежные вопросы