Кеширует ли Django связанные поля ForeignKey и ManyToManyField после доступа к ним? - PullRequest
10 голосов
/ 29 ноября 2011

Принимая во внимание следующую модель, кэширует ли Django связанные объекты после первого обращения к ним?

class Post(models.Model):
    authors = models.ManyToManyField(User)
    category = models.ForeignKey(Category)

Например:

post = Post.objects.get(id=1)

# as i understand this hits the database
authors1 = post.authors.all()
# does this his the database again?
authors2 = post.authors.all()

# as i understand this hits the database
category1 = post.category
# does this hit the database again?
category2 = post.category

Примечание: в настоящее время работает с Django1.3, но хорошо знать, что доступно в других версиях.

1 Ответ

6 голосов
/ 29 ноября 2011

В первом примере второй запрос кэшируется . Во втором случае (я полагаю) они оба вызовут попадание в БД, если вы не используете select_related в исходном запросе:

post = Post.objects.select_related('category').get(id=1)

РЕДАКТИРОВАТЬ

Я не прав насчет второго примера.Если вы используете select_related в исходном запросе, вы больше не попадете в базу данных (ForeignKey немедленно кэшируется).Если вы не используете select_related, вы попадете в БД по первому запросу, но второй запрос будет кэширован.

From:

https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-many-relationships

Прямой доступ к отношениям «один ко многим» кэшируется при первом обращении к связанному объекту.Последующие обращения к внешнему ключу в том же экземпляре объекта кэшируются.

Обратите внимание, что метод QuerySet select_related () рекурсивно заранее заполняет кэш всех отношений «один ко многим».

...