Кэширование моделей внешнего ключа Django по умолчанию

#django

#джанго

Вопрос:

Ни за что на свете я не могу найти ответ на этот вопрос в Интернете, хотя он является основным.

У меня есть две модели, одна из которых ссылается на другую:

 class A(models.Model):
    name = models.CharField(...)
    ...

class B(models.Model):
    a = models.ForeignKey(A)
 

Теперь я храню экземпляр B в памяти и очень часто обращаюсь b.a.name к нему. b.a.name Вызывает ли доступ к базе данных запрос каждый раз, так что изменения в a.name (изменения, внесенные другим процессом) видны в моем процессе? Или я должен a каждый раз запрашивать явно?

Ответ №1:

Я удивлен, что вы не смогли найти никакой информации по этому поводу. Довольно хорошо документировано, что прямые отношения кэшируются при первом использовании — происходит то, что создается атрибут кэша, и последующие запросы сначала проверят это.

Так что да, это означает, что изменения этого объекта в другом процессе не будут видны, и вам нужно будет каждый раз повторно запрашивать. (Обратите также внимание, что в зависимости от настройки изоляции транзакций вашей базы данных вы можете даже не увидеть новое значение при повторном запросе — возможно, вам потребуется сначала зафиксировать текущую транзакцию.)

Комментарии:

1. Я тоже удивлен, обычно я нахожу такие вещи. Спасибо, я сделаю соответствующий запрос.