Метод update_or_create
Метод update_or_create применяется к менеджеру модели и позволяет обновить существующий объект, если он найден, или создать новый объект, если объект не найден. Метод принимает два обязательных словаря: defaults для значений полей при обновлении или создании и критерии поиска в виде ключевых аргументов. Метод возвращает кортеж из двух элементов: объект и булево значение, указывающее, был ли объект создан. Этот метод выполняется в рамках одной транзакции базы данных, что гарантирует атомарность операции.
Синтаксис
Model.objects.update_or_create(defaults=None, **kwargs)
Пример . Модель
Рассмотрим модель Article, которая будет использоваться в примерах:
from 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 уже есть:
from 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}")
Результат выполнения кода:
"Created: True"
"Article title: Django Tutorial for Beginners"
Если объекта с slug="django-tutorial" не существует, он будет создан с указанными значениями из defaults.
Пример
Давайте обновим существующую статью, увеличив количество просмотров, или создадим новую, если её нет:
from 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}")
Результат выполнения кода:
"Created: False"
"Views: 42"
В этом примере существующая статья с slug="python-basics" была обновлена, количество просмотров увеличилось на 1. Если бы статьи не было, она была бы создана с views=1.
Пример
Рассмотрим пример с использованием нескольких критериев поиска и сложных значений в defaults:
from 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}")
Результат выполнения кода:
"Created: True"
"Title: Web Development Guide 2025"
"Updated at: 2026-09-05 14:30:25.123456"
Смотрите также
-
метод
get_or_create,
который получает существующий объект или создаёт новый -
метод
update,
который обновляет все объекты вQuerySet -
метод
create,
который создаёт новый объект в базе данных -
метод
save,
который сохраняет объект в базе данных