Метод refresh_from_db
Метод refresh_from_db применяется к экземпляру модели и перезагружает его поля из базы данных. Это полезно, когда объект мог быть изменён в другом месте (например, другим пользователем или фоновым процессом), и нужно получить актуальные данные без выполнения нового запроса на получение объекта. Метод поддерживает выборочное обновление полей с помощью параметра fields.
Синтаксис
instance.refresh_from_db(using=None, fields=None)
Метод принимает два необязательных параметра:
-
using- имя базы данных, из которой следует загрузить данные. По умолчанию используется база данных по умолчанию. -
fields- список имён полей, которые необходимо обновить. Если указан, то только перечисленные поля будут перезагружены из базы данных. Это может быть полезно для оптимизации производительности.
Важно отметить, что метод refresh_from_db работает только с уже сохранёнными в базе данных объектами. Если объект ещё не сохранён (не имеет первичного ключа), метод вызовет исключение ValueError.
Пример
Рассмотрим модель Article с полями title, views и updated_at. Получим объект из базы данных, изменим его в другом месте, а затем обновим текущий экземпляр с помощью refresh_from_db:
from myapp.models import Article
from django.utils import timezone
# Получаем статью из базы данных
article = Article.objects.get(pk=1)
print(article.title)
print(article.views)
# В другом месте (например, другой пользователь) увеличил количество просмотров
# Просто имитируем изменение в базе данных без обновления нашего объекта
Article.objects.filter(pk=1).update(views=100, updated_at=timezone.now())
# Обновляем наш объект из базы данных
article.refresh_from_db()
print(article.views)
print(article.updated_at)
Результат выполнения кода:
"article"
"0"
"100"
"2026-09-05 12:30:45.123456+00:00"
В этом примере мы видим, что после вызова refresh_from_db объект получил актуальные данные из базы данных, включая обновлённое количество просмотров и время последнего обновления.
Пример . С параметром fields
Используем параметр fields для обновления только определённых полей объекта:
from myapp.models import Article
from django.utils import timezone
# Получаем статью
article = Article.objects.get(pk=1)
print(article.title)
print(article.views)
print(article.updated_at)
# Имитируем изменения в базе данных
Article.objects.filter(pk=1).update(
title="New article title",
views=150,
updated_at=timezone.now()
)
# Обновляем только поля title и views
article.refresh_from_db(fields=['title', 'views'])
print(article.title)
print(article.views)
# Поле updated_at осталось старым
print(article.updated_at)
Результат выполнения кода:
"article"
"0"
"2026-09-05 12:30:45.123456+00:00"
"New article title"
"150"
"2026-09-05 12:30:45.123456+00:00"
Как видно из примера, поле updated_at не было обновлено, поскольку мы указали обновлять только title и views. Это позволяет контролировать, какие именно поля нужно перезагрузить, и экономить ресурсы базы данных.
Пример . Работа со связанными объектами
Метод refresh_from_db обновляет только поля текущего объекта, но не обновляет связанные объекты, загруженные через отношения (например, через ForeignKey или ManyToManyField). Рассмотрим это на примере:
from myapp.models import Article, Category
# Создаём категорию
category = Category.objects.create(name="Technology")
# Создаём статью с этой категорией
article = Article.objects.create(title="Old title", category=category)
# Изменяем категорию в базе данных
new_category = Category.objects.create(name="Science")
Article.objects.filter(pk=article.pk).update(category=new_category)
# Обновляем статью из базы данных
article.refresh_from_db()
# Теперь статья имеет новую категорию
print(article.category.name)
# Но если у нас есть предварительно загруженный объект категории,
# он не будет обновлён автоматически
print(category.name) # "Technology" - объект категории не обновился
Результат выполнения кода:
"Science"
"Technology"
Для обновления связанных объектов необходимо либо получить их заново из базы данных, либо использовать методы предварительной загрузки (select_related, prefetch_related) при первоначальном получении объекта.
Пример . Обработка исключений
Если объект был удалён из базы данных, вызов refresh_from_db вызовет исключение DoesNotExist. Важно обрабатывать такие ситуации:
from myapp.models import Article
from django.core.exceptions import ObjectDoesNotExist
article = Article.objects.get(pk=1)
# Удаляем статью из базы данных
article.delete()
try:
article.refresh_from_db()
except ObjectDoesNotExist:
print("Article no longer exists in database")
Результат выполнения кода:
"Article no longer exists in database"