Evgenii Legotckoi
Evgenii Legotckoi16 октября 2022 г. 15:58

django_model_cached_property - Кэширование property для отдельных объектов моделей в Django

Представляю релиз стабильной батарейки django_model_cached_property для кэширования property для отдельных объектов моделей в Django.

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

Назначение

Пакет используется для кэширования результата методов объектов моделей на период, который дольше существования инстанса обхекта во время обработки запроса пользователя. Это необходимо для того, чтобы кэшировать тяжёлые запросы к базе данных, результаты которых теоретически не должны изменяться довольно часто, но при этом их вызов каждый раз при запросе пользователя может сильно уменьшить скорость работы пользователя с Django приложением. Это может быть полезно, например, для информации о том, лайкнул ли пользователь какой-то объект, а также количество лайкнувших, в том случае если используются Generic связи в базе данных. К сожалению такие связи работают не так быстро, как хотелось бы. Поэтому правильное кэширование может очень сильно ускорить работу сайта.

А теперь расскажу, как пользоваться данным функционалом

Установка

pip install -U django-model-cached-property

Установка и настройка требований

Установите Redis для кэширования.

sudo apt install redis-server

Настройте setup.py вашего проекта django.

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

Использование

Пакет содержит две функции:

  • model_cached_property - это декоратор для методов класса, который будет кэшировать результаты вызова свойства для отдельных записей.

  • invalidate_model_cached_property - это функция для инвалидации метода на свойстве записи модели.

model_cached_property

Вы можете использовать этот декоратор следующим образом.

from django_model_cached_property import model_cached_property

class Article(models.Model):

    @model_cached_property
    def comments_count(self):
        return self.comments.count()

Это означает, что вы кешируете количество комментариев для каждой записи статьи в вашем проекте Django.

Вы можете установить время ожидания кеша 3000 секунд следующим образом.

class Article(models.Model):

    @model_cached_property(timeout=3000)
    def comments_count(self):
        return self.comments.count()

По умолчанию тайм-аут кэширования составляет 60 секунд, вы можете настроить его глобально в settings.py .

MODEL_CACHED_PROPERTY_TIMEOUT = 300000

Кроме того, вы можете использовать кэширование свойства модели с входными аргументами.

И в этом случае кэширование будет оцениваться для всех входных наборов аргументов.

Например, кэширование с авторизованным пользователем.

class Article(models.Model):

    @model_cached_property
    def __user_in_bookmarks(self, user):
        return self.bookmarks.filter(user=user).exists()

    def user_in_bookmarks(self, user):
        return self.__user_in_bookmarks(user) if user.is_authenticated else False

invalidate_model_cached_property

Эта функция делает недействительными все ключи кеша в свойстве для одной записи модели в базе данных.

Например

article = get_object_or_404(Article, pk=12)
invalidate_model_cached_property(article, article.comments_count)

В этом случае вы сделаете недействительными все кэшированные ключи для статьи с первичным ключом 2.

ВНИМАНИЕ - Ограничение

Ограничение этой функциональности кэширования состоит в том, что вы можете использовать ее только с уникальными входными аргументами. Это означает, что с объектом AnonymousUser это работать не будет, так как в каждом запросе информация об объекте AnonymousUser будет разной, хотя он и будет вызываться одним и тем же пользователем. Поэтому используйте его только для уникальной информации.

Заключение

Дорогие пользователи сайта EVILEG, если Вам не будет трудно, то пожалуйста, оцените звездочкой репозиторий проекта на GitHub

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

NSProject
  • 17 октября 2022 г. 7:32

О хорошая статья. Для какой ветки Django будет работать эта батарейка?

Evgenii Legotckoi
  • 17 октября 2022 г. 7:37
  • (ред.)

Я тестировал только на Django 4, но сам код не менялся пожалуй с версии Django 2, так что предполагаю, что должно работать во всех версиях, но если протестируете на более ранних версиях, и будет нормально работать, то дайте фидбек. Спасибо.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
SH
  • Sak Hax
  • 25 апреля 2024 г. 11:00

C++ - Тест 001. Первая программа и типы данных

  • Результат:33баллов,
  • Очки рейтинга-10
г
  • ги
  • 23 апреля 2024 г. 12:51

C++ - Тест 005. Структуры и Классы

  • Результат:41баллов,
  • Очки рейтинга-8
l
  • laei
  • 23 апреля 2024 г. 6:19

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:10баллов,
  • Очки рейтинга-10
Последние комментарии
k
kmssr8 февраля 2024 г. 15:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко4 февраля 2024 г. 22:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 7:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 5:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 декабря 2023 г. 18:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
G
Gar22 апреля 2024 г. 2:46
Clipboard Как скопировать окно целиком в clipb?
DA
Dr Gangil Academics20 апреля 2024 г. 4:45
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
a
a_vlasov14 апреля 2024 г. 3:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев13 апреля 2024 г. 23:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex4 апреля 2024 г. 1:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Следите за нами в социальных сетях