Evgenii Legotckoi
Evgenii LegotckoiҚаз. 16, 2022, 3:58 Т.Қ.

django_model_cached_property - Django ішіндегі жеке үлгі нысандары үшін кэштеу сипаты

Django ішіндегі жеке үлгі нысандары үшін кэштеу сипатына арналған тұрақты батареяның django_model_cached_property шығарылымын енгізу.

Мен evileg_core құрамында ұқсас функция бар екенін айттым, бірақ енді мен бұл кэштеуді бөлек пакетке енгізуді шештім. Бұл менің мұндай үлкен пакетті ұстауға уақытым жоқ екеніне байланысты және мен басқа жобаларымда бөлек шағын функционалдылықты қолданамын. Сондықтан, мен үшін үлкен жобаны тәуелсіз жобаларға бөлу қисынды болып көрінді, осылайша, ең болмағанда, ең болмағанда өз жобаларымның аясында ең көп сұралатын функционалдылықты қолдау оңайырақ болады. Сондай-ақ бұл пакет басқа әзірлеушілер үшін өте пайдалы болады деп үміттенемін.

Мақсат

Бума пайдаланушы сұрауы өңделіп жатқан кезде нысан данасы бар кезеңнен ұзағырақ мерзімге үлгі нысаны әдістерінің нәтижесін кэштеу үшін пайдаланылады. Бұл деректер базасының ауыр сұрауларын кэштеу үшін қажет, олардың нәтижелері теориялық тұрғыдан жиі өзгермеуі керек, бірақ сонымен бірге оларды пайдаланушы сұраулары сайын шақыру пайдаланушының Django қосымшасымен жұмыс жылдамдығын айтарлықтай төмендетуі мүмкін. Бұл, мысалы, дерекқордағы Жалпы қарым-қатынастар пайдаланылған жағдайда, пайдаланушыға нысанды ұнатқан-ұнамағаны, сондай-ақ ұнатулар саны туралы ақпарат алу үшін пайдалы болуы мүмкін. Өкінішке орай, мұндай байланыстар біз қалағандай жылдам жұмыс істемейді. Сондықтан дұрыс кэштеу сайтты айтарлықтай жылдамдатуы мүмкін.

Енді мен бұл функцияны қалай пайдалану керектігін айтамын.

Орнату

pip install -U django-model-cached-property

Талаптарды орнату және конфигурациялау

Кэштеу үшін redis орнатыңыз.

sudo apt install redis-server

Джанго жобасының setup.py параметрін конфигурациялаңыз.

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 - бұл үлгі жазба сипатындағы әдісті жарамсыз деп тануға арналған функция.

үлгі_кэштелген_сипат

Бұл декораторды келесі жолмен пайдалануға болады.

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

үлгінің_кэштелген_сипатын жарамсыз

Бұл функция дерекқордағы бір үлгі жазбасы үшін сипаттағы барлық кэш кілттерін жарамсыз етеді.
Мысалы

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

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

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз