From 5bfae66ad5e716ed525c649a4f2f1e273e5d0a61 Mon Sep 17 00:00:00 2001 From: phzhik Date: Fri, 7 Jul 2023 02:28:46 +0400 Subject: [PATCH] + thread-safe cache for GlobalSettings --- store/models.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/store/models.py b/store/models.py index 549cda9..8b0e985 100644 --- a/store/models.py +++ b/store/models.py @@ -1,10 +1,8 @@ -import time from decimal import Decimal -from datetime import datetime import random import string -import uuid from io import BytesIO +from threading import local as LocalContext from django.conf import settings from django.contrib.admin import display @@ -23,7 +21,7 @@ from store.utils import create_preview, concat_not_null_values class GlobalSettings(models.Model): - cached = None + context = LocalContext() # currency yuan_rate = models.DecimalField('Курс CNY/RUB', max_digits=10, decimal_places=2, default=0) @@ -40,18 +38,18 @@ class GlobalSettings(models.Model): # Store only one instance of GlobalSettings self.__class__.objects.exclude(id=self.id).delete() super().save(*args, **kwargs) - GlobalSettings.cached = self + GlobalSettings.context.cached = self def __str__(self) -> str: return f'GlobalSettings for {self.id}' @classmethod def load(cls) -> 'GlobalSettings': - if cls.cached is not None: - return cls.cached + if hasattr(cls.context, 'cached'): + return cls.context.cached obj, _ = cls.objects.get_or_create(id=1) - cls.cached = obj + cls.context.cached = obj return obj