Метод update_or_create

Метод update_or_create применяется к менеджеру модели и позволяет обновить существующий объект, если он найден, или создать новый объект, если объект не найден. Метод принимает два обязательных словаря: defaults для значений полей при обновлении или создании и критерии поиска в виде ключевых аргументов. Метод возвращает кортеж из двух элементов: объект и булево значение, указывающее, был ли объект создан. Этот метод выполняется в рамках одной транзакции базы данных, что гарантирует атомарность операции.

Синтаксис

pythonModel.objects.update_or_create(defaults=None, **kwargs)

Пример . Модель

Рассмотрим модель Article, которая будет использоваться в примерах:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=200)
  slug = models.SlugField(unique=True)
  content = models.TextField()
  views = models.IntegerField(default=0)
  is_published = models.BooleanField(default=False)
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)

  def __str__(self):
    return self.title

Пример

Давайте создадим новую статью или обновим существующую, если статья с таким slug уже есть:

pythonfrom myapp.models import Article

article, created = Article.objects.update_or_create(
  slug="django-tutorial",
  defaults={
    "title": "Django Tutorial for Beginners",
    "content": "This is a comprehensive guide to Django.",
    "is_published": True
  }
)

print(f"Created: {created}")
print(f"Article title: {article.title}")

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

python"Created: True"
"Article title: Django Tutorial for Beginners"

Если объекта с slug="django-tutorial" не существует, он будет создан с указанными значениями из defaults.

Пример

Давайте обновим существующую статью, увеличив количество просмотров, или создадим новую, если её нет:

pythonfrom myapp.models import Article

article, created = Article.objects.update_or_create(
  slug="python-basics",
  defaults={
    "title": "Python Basics",
    "views": models.F("views") + 1
  }
)

print(f"Created: {created}")
print(f"Views: {article.views}")

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

python"Created: False"
"Views: 42"

В этом примере существующая статья с slug="python-basics" была обновлена, количество просмотров увеличилось на 1. Если бы статьи не было, она была бы создана с views=1.

Пример

Рассмотрим пример с использованием нескольких критериев поиска и сложных значений в defaults:

pythonfrom myapp.models import Article
from datetime import datetime

article, created = Article.objects.update_or_create(
  slug="web-dev-guide",
  is_published=True,
  defaults={
    "title": "Web Development Guide 2025",
    "content": "Updated content for 2025.",
    "views": 100,
    "updated_at": datetime.now()
  }
)

print(f"Created: {created}")
print(f"Title: {article.title}")
print(f"Updated at: {article.updated_at}")

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

python"Created: True"
"Title: Web Development Guide 2025"
"Updated at: 2026-09-05 14:30:25.123456"

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

  • метод get_or_create,
    который получает существующий объект или создаёт новый
  • метод update,
    который обновляет все объекты в QuerySet
  • метод create,
    который создаёт новый объект в базе данных
  • метод save,
    который сохраняет объект в базе данных