maxclax
@maxclax

Как работает @cached_property в django?

Не могу понять как работает @cached_property в моделе. Необходимо выводить счетчик записей. Делаю следующим методом:

class Categorie(MPTTModel):
    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

    def __str__(self):
        return self.name

    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
    name = models.CharField(unique=True, max_length=60)
    slug = models.SlugField(unique=True, max_length=80, default='')
    created_at = models.DateField(auto_now_add=True)

    class MPTTMeta:
        order_insertion_by = ['name']

    @cached_property
    def sites(self):
        return self.site_set.count()


Но при каждом запросе к sites идет запрос в БД. В моем понимании должно работать по следующей схеме: первый запрос к БД и все последующие с кеша. После del sites снова запрос к БД. Помогите понять
  • Вопрос задан
  • 2269 просмотров
Решения вопроса 1
Astrohas
@Astrohas
Python/Django Developer
Вы неправильно поняли cached _property, он нужен для ленивых свойств, которые будут вычисляться только при вызове. На хабра есть статейка https://habrahabr.ru/post/159099/
И да это не кэширование, а просто lazy_load
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Если в проекте уже используется redis, то неплохим решением будет cacheops. можно настроить чтоб кэшировались только count запросы определённой модели.

само собой применять с осторожностью, и только где сталкиваетесь с нагрузками, всё подряд кэшировать не стоит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы