Метод update
Метод update применяется к QuerySet и выполняет массовое обновление всех записей, соответствующих условиям выборки. В отличие от сохранения отдельных объектов через save, этот метод выполняет один SQL-запрос UPDATE, что делает его значительно более производительным при работе с большим количеством записей. Метод принимает параметры в виде именованных аргументов, где ключ - имя поля модели, а значение - новое значение для этого поля. Возвращает количество обновленных записей.
Синтаксис
Model.objects.filter(**conditions).update(**updates)
Пример
Давайте обновим статус всех статей со статусом "draft" на "published":
from myapp.models import Article
updated_count = Article.objects.filter(status='draft').update(status='published')
print(f"Updated articles: {updated_count}")
Результат выполнения кода:
"Updated articles: 5"
Как видите, метод вернул количество обновленных записей. При этом сами объекты не были загружены в память Python, что экономит ресурсы при массовых операциях.
Пример
Обновим несколько полей одновременно, увеличив рейтинг и изменив дату публикации для статей определенного автора:
from myapp.models import Article
from datetime import datetime
from django.utils import timezone
author_id = 10
updated_count = Article.objects.filter(
author_id=author_id,
is_published=True
).update(
rating=5,
published_at=timezone.now()
)
print(f"Updated articles: {updated_count}")
Результат выполнения кода:
"Updated articles: 3"
В этом примере мы обновили два поля для всех опубликованных статей выбранного автора. Обратите внимание, что метод update не вызывает сигналы pre_save и post_save, а также не обновляет поле auto_now, если оно не указано явно.
Пример
Использование выражений F() для атомарного обновления значений на основе текущих данных:
from myapp.models import Product
from django.db.models import F
updated_count = Product.objects.filter(
stock__gt=0
).update(
price=F('price') * 1.1,
stock=F('stock') - 1
)
print(f"Updated products: {updated_count}")
Результат выполнения кода:
"Updated products: 15"
Выражение F позволяет ссылаться на текущие значения полей в том же запросе, что гарантирует атомарность операции и предотвращает состояния гонки в конкурентной среде.
Пример
Обновление записей с учетом связанных моделей через фильтрацию и обновление значений:
from myapp.models import Order, Customer
from datetime import datetime
updated_count = Order.objects.filter(
customer__status='active',
created_at__lt=datetime(2024, 1, 1)
).update(
status='completed',
completed_at=datetime.now()
)
print(f"Updated orders: {updated_count}")
Результат выполнения кода:
"Updated orders: 8"
Метод update может использоваться совместно с фильтрацией по полям связанных моделей, что позволяет обновлять записи на основе сложных условий.
Смотрите также
-
метод
bulk_update,
который обновляет несколько объектов с различными значениями -
метод
update_or_create,
который обновляет или создает объект в зависимости от условий -
метод
get_or_create,
который получает или создает объект -
метод
delete,
который удаляет записи изQuerySet