Метод update

Метод update применяется к QuerySet и выполняет массовое обновление всех записей, соответствующих условиям выборки. В отличие от сохранения отдельных объектов через save, этот метод выполняет один SQL-запрос UPDATE, что делает его значительно более производительным при работе с большим количеством записей. Метод принимает параметры в виде именованных аргументов, где ключ - имя поля модели, а значение - новое значение для этого поля. Возвращает количество обновленных записей.

Синтаксис

pythonModel.objects.filter(**conditions).update(**updates)

Пример

Давайте обновим статус всех статей со статусом "draft" на "published":

pythonfrom myapp.models import Article

updated_count = Article.objects.filter(status='draft').update(status='published')
print(f"Updated articles: {updated_count}")

Результат выполнения кода:

python"Updated articles: 5"

Как видите, метод вернул количество обновленных записей. При этом сами объекты не были загружены в память Python, что экономит ресурсы при массовых операциях.

Пример

Обновим несколько полей одновременно, увеличив рейтинг и изменив дату публикации для статей определенного автора:

pythonfrom 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}")

Результат выполнения кода:

python"Updated articles: 3"

В этом примере мы обновили два поля для всех опубликованных статей выбранного автора. Обратите внимание, что метод update не вызывает сигналы pre_save и post_save, а также не обновляет поле auto_now, если оно не указано явно.

Пример

Использование выражений F() для атомарного обновления значений на основе текущих данных:

pythonfrom 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}")

Результат выполнения кода:

python"Updated products: 15"

Выражение F позволяет ссылаться на текущие значения полей в том же запросе, что гарантирует атомарность операции и предотвращает состояния гонки в конкурентной среде.

Пример

Обновление записей с учетом связанных моделей через фильтрацию и обновление значений:

pythonfrom 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}")

Результат выполнения кода:

python"Updated orders: 8"

Метод update может использоваться совместно с фильтрацией по полям связанных моделей, что позволяет обновлять записи на основе сложных условий.

Смотрите также

  • метод bulk_update,
    который обновляет несколько объектов с различными значениями
  • метод update_or_create,
    который обновляет или создает объект в зависимости от условий
  • метод get_or_create,
    который получает или создает объект
  • метод delete,
    который удаляет записи из QuerySet