我有一个非常简单的模型,其中包含我需要在我的应用程序的不同位置使用的数据:
class Setting(models.Model):
name = models.CharField()
value = models.TextField()
我希望能够将这些信息加载到字典中,然后将这些数据传送到我的应用程序中,这样我就不必对数据库进行重复调用。我这样做的尝试是将逻辑包装在一个类似的模块中(print
语句用于调试):
my_settings.py
from myapp import models
class Settings:
__settings = {}
def __init__(self):
if(not self.__class__.__settings):
print("===== Loading settings from table =====")
qs = models.Setting.objects.all()
for x in qs:
self.__class__.__settings[x.name] = x.value
def get(self, key, default=None):
return self.__class__.__settings.get(key, default)
def getint(self, key, default=0):
return int(self.__class__.__settings.get(key, default))
使用此模块将如下所示:
from my_settings import Settings
# Down in some view somewhere...
settings = Settings()
data = settings.get("some_key")
...
# Now we might be in a helper function somewhere, but still in the
# same view context as above. Note that we should not have made
# a database round trip here; we're using our memory store instead.
settings = Settings()
data = settings.get("another_key")
这似乎工作正常,但它的缺点是数据在初始实例化时被加载一次(并且只加载一次)。如果设置数据库表中的任何数据发生更改,则这些更改不会反映在此类持有的相应字典中。
这里有更好的方法吗?我不介意每个请求都有一个数据库查询,但我也不想在函数之间传递字典。我希望一个模块级的包装器能让我获得我所希望的“单身” - 但它显然比我想象的更积极地缓存事物。