Django: кэширование связанных объектов с использованием select_related

Я пытаюсь кэшировать объект модели Django с объектами RelatedObjects. Но когда я получаю доступ к связанным объектам, запрос запускается. Вот код:

class Main(models.Model):
    name = models.CharField('Name', max_length=100)

class Related(models.Model):
    main = models.ForeignKey(Main, related_name="related")
    name = models.CharField('Name', max_length=100)

def cache_main_with_related():
    obj = Main.objects.select_related('related').get(name="abc")
    cache.set('cache:abc', obj)  # I want related also to get cached

def access_cache():
    cached_obj = cache.get('cache:abc')
    print cached_obj.name  # No query fired
    print cached_obj.related.all()  # This fires a DB query even though abc is cached after select_related

Поэтому, когда я обращаюсь к связанным объектам кэшированного объекта, база данных получает удар. Я вижу это в django.db.backends logger.

Вопросы:

  1. Я делаю что-то не так или это ожидается?

  2. Кеширование не включает связанные объекты по умолчанию? Должен ли я их кэшировать отдельно?

1 ответ

Решение

Это не имеет ничего общего с кэшированием; то же самое произошло бы, если бы вы получили доступ obj.related.all() на первый взгляд. Это потому что select_related не работает на обратные отношения; вам нужно prefetch_related для этого.

Другие вопросы по тегам