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

Метод 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"

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

  • метод save,
    который сохраняет текущее состояние объекта в базу данных
  • метод delete,
    который удаляет объект из базы данных
  • метод from_db,
    который создаёт экземпляр модели из данных базы данных
  • атрибут pk,
    который содержит первичный ключ объекта
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить