РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
72 of 818 menu

Метод 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить