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, так что предполагаю, что должно работать во всех версиях, но если протестируете на более ранних версиях, и будет нормально работать, то дайте фидбек. Спасибо.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

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

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 1:37

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

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 1:29

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

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 11:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 14:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 8:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 7:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 11:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
m
moogo22 ноября 2024 г. 7:17
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 6:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 3:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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