Evgenii Legotckoi
Evgenii Legotckoi16. Oktober 2022 15:58

django_model_cached_property – Caching-Eigenschaft für einzelne Modellobjekte in Django

Einführung der Veröffentlichung der stabilen Batterie django_model_cached_property zum Caching von Eigenschaften für einzelne Modellobjekte in Django.

Ich habe bereits gesagt, dass evileg_core eine ähnliche Funktionalität enthält, aber jetzt habe ich beschlossen, dieses Caching in ein separates Paket zu bringen. Dies liegt daran, dass ich keine Zeit habe, ein so großes Paket zu warten, und ich in meinen anderen Projekten separate kleine Funktionen verwende. Daher erschien es mir logisch, ein großes Projekt in unabhängige Projekte aufzuteilen, damit es zumindest im Rahmen meiner eigenen Projekte einfacher wäre, zumindest die am häufigsten nachgefragten Funktionen zu unterstützen. Ich hoffe auch, dass dieses Paket für andere Entwickler sehr nützlich sein wird.

Zweck

Das Paket wird verwendet, um das Ergebnis von Modellobjektmethoden für einen Zeitraum zwischenzuspeichern, der länger ist als die Existenz der Objektinstanz, während die Anforderung des Benutzers verarbeitet wird. Dies ist notwendig, um umfangreiche Datenbankabfragen zwischenzuspeichern, deren Ergebnisse sich theoretisch nicht allzu oft ändern sollten, aber gleichzeitig deren Aufruf bei jeder Benutzeranfrage die Geschwindigkeit der Arbeit des Benutzers mit der Django-Anwendung erheblich verringern kann. Dies kann zum Beispiel für Informationen darüber nützlich sein, ob dem Benutzer ein Objekt gefallen hat, sowie die Anzahl der Likes, falls generische Beziehungen in der Datenbank verwendet werden. Leider funktionieren solche Verbindungen nicht so schnell, wie wir es gerne hätten. Daher kann das richtige Caching die Site erheblich beschleunigen.

Und jetzt erkläre ich Ihnen, wie Sie diese Funktion verwenden.

Installieren

pip install -U django-model-cached-property

Anforderungen installieren und konfigurieren

Installieren Sie Redis für das Caching.

sudo apt install redis-server

Konfigurieren Sie setup.py Ihres Django-Projekts.

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

Verwenden

Paket enthält zwei Funktionen:

  • model_cached_property - es ist ein Decorator für Klassenmethoden, die Ergebnisse von Eigenschaftsaufrufen für separate Datensätze zwischenspeichern.
  • invalidate_model_cached_property - Dies ist eine Funktion zur Invalidierung der Methode für die Modelldatensatzeigenschaft.

model_cached_property

Sie können diesen Dekorateur auf folgende Weise verwenden.

from django_model_cached_property import model_cached_property

class Article(models.Model):

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

Das bedeutet, dass Sie Kommentare für jeden Artikeldatensatz in Ihrem Django-Projekt zwischenspeichern.

Sie können das Cache-Timeout auf folgende Weise auf 3000 Sekunden einstellen.

class Article(models.Model):

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

Standardmäßig beträgt das Caching-Timeout 60 Sekunden, indem Sie es global in settings.py einrichten.

MODEL_CACHED_PROPERTY_TIMEOUT = 300000

Darüber hinaus können Sie das Caching von Modelleigenschaften mit Eingabeargumenten verwenden. Und in diesem Fall wird das Caching für alle Eingabesätze von Argumenten ausgewertet. Zum Beispiel Caching durch authentifizierten Benutzer.

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

Diese Funktion macht alle Cache-Schlüssel auf der Eigenschaft für einen Modelldatensatz in der Datenbank ungültig.

Zum Beispiel

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

In diesem Fall machen Sie alle zwischengespeicherten Schlüssel für Artikel mit Primärschlüssel 2 ungültig.

WARNUNG - Einschränkung

Die Einschränkung dieser Caching-Funktionalität besteht darin, dass Sie sie nur mit eindeutigen Eingabeargumenten verwenden können. Dies bedeutet, dass dies nicht mit dem AnonymousUser-Objekt funktioniert, da die Informationen über das AnonymousUser-Objekt in jeder Anforderung unterschiedlich sind, obwohl es vom selben Benutzer aufgerufen wird. Verwenden Sie es daher nur für eindeutige Informationen.

Fazit

Liebe Nutzer der EVILEG-Website, wenn es Ihnen nicht schwer fällt, bewerten Sie bitte das Projekt-Repository auf GitHub mit einem Sternchen

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

NSProject
  • 17. Oktober 2022 07:32

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

Evgenii Legotckoi
  • 17. Oktober 2022 07:37
  • (bearbeitet)

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken