Evgenii Legotckoi
Evgenii Legotckoi17 октября 2022 г. 1: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 г. 17:32

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

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
1
  • 12333
  • 18 июля 2024 г. 12:34

Qt - Тест 001. Сигналы и слоты

  • Результат:63баллов,
  • Очки рейтинга-1
1
  • 12333
  • 18 июля 2024 г. 12:25

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

  • Результат:50баллов,
  • Очки рейтинга-4
AM

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

  • Результат:33баллов,
  • Очки рейтинга-10
Последние комментарии
d
dblas55 июля 2024 г. 18:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr9 февраля 2024 г. 2:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 9:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 18:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 16:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Сейчас обсуждают на форуме
F
Fynjy22 июля 2024 г. 11:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCT25 июня 2024 г. 8:00
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 22:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
BlinCT
BlinCT5 мая 2024 г. 12:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi2 мая 2024 г. 21:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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