Ответ
Да, для выборочного обновления полей модели при вызове метода save() используется аргумент update_fields. Он принимает список строк с именами полей, которые необходимо обновить в базе данных.
Почему это важно?
- Производительность: Генерируется более легковесный SQL-запрос
UPDATE, который затрагивает только указанные столбцы. - Предотвращение гонки данных (Race Conditions): Если другой процесс изменил поле, которое вы не собирались трогать, передача
update_fieldsгарантирует, что вы не перезапишете его значение случайно. - Работа с сигналами: Сигналы будут вызваны, но могут работать с неполным состоянием объекта.
Пример использования:
from myapp.models import MyModel
# Получаем существующий объект
obj = MyModel.objects.get(pk=1)
# Изменяем несколько полей в объекте Python
obj.name = 'Новое имя'
obj.counter = 10
# Сохраняем в БД только поле 'name'
# Изменение поля 'counter' будет проигнорировано
obj.save(update_fields=['name'])
Ключевые моменты:
- Параметр
update_fieldsработает только при обновлении существующих объектов и игнорируется при создании нового (при первом вызовеsave()). - Поля с
auto_now=True(например,DateTimeField) будут обновлены всегда, даже если их нет в спискеupdate_fields. - Если
update_fieldsпуст ([]), сохранение не произойдет.
Для массовых обновлений без загрузки объектов в память эффективнее использовать метод update() у QuerySet:
MyModel.objects.filter(pk=1).update(name='Новое имя')