Метод refresh_from_db

Метод refresh_from_db применяется к экземпляру модели и перезагружает его поля из базы данных. Это полезно, когда объект мог быть изменён в другом месте (например, другим пользователем или фоновым процессом), и нужно получить актуальные данные без выполнения нового запроса на получение объекта. Метод поддерживает выборочное обновление полей с помощью параметра fields.

Синтаксис

pythoninstance.refresh_from_db(using=None, fields=None)

Метод принимает два необязательных параметра:

Важно отметить, что метод refresh_from_db работает только с уже сохранёнными в базе данных объектами. Если объект ещё не сохранён (не имеет первичного ключа), метод вызовет исключение ValueError.

Пример

Рассмотрим модель Article с полями title, views и updated_at. Получим объект из базы данных, изменим его в другом месте, а затем обновим текущий экземпляр с помощью refresh_from_db:

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

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

python"article"
"0"
"100"
"2026-09-05 12:30:45.123456+00:00"

В этом примере мы видим, что после вызова refresh_from_db объект получил актуальные данные из базы данных, включая обновлённое количество просмотров и время последнего обновления.

Пример . С параметром fields

Используем параметр fields для обновления только определённых полей объекта:

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

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

python"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). Рассмотрим это на примере:

pythonfrom 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" - объект категории не обновился

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

python"Science"
"Technology"

Для обновления связанных объектов необходимо либо получить их заново из базы данных, либо использовать методы предварительной загрузки (select_related, prefetch_related) при первоначальном получении объекта.

Пример . Обработка исключений

Если объект был удалён из базы данных, вызов refresh_from_db вызовет исключение DoesNotExist. Важно обрабатывать такие ситуации:

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

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

python"Article no longer exists in database"

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

  • метод save,
    который сохраняет текущее состояние объекта в базу данных
  • метод delete,
    который удаляет объект из базы данных
  • метод from_db,
    который создаёт экземпляр модели из данных базы данных
  • атрибут pk,
    который содержит первичный ключ объекта