我想在我的django应用程序中有一个全局变量,它存储了我后来在某些函数中使用的结果列表,我不想再评估一次这样的查询集,我这样做:
from app.models import StopWord
a = list(StopWord.objects.values_list('word', flat=True))
...
def some_func():
... (using a variable) ...
这对我来说似乎没问题,但问题是syncdb和test命令抛出异常:
django.db.utils.DatabaseError: (1146, "Table 'app_stopword' doesn't exist")
我不知道怎么摆脱这个,可能是我走错了路?
答案 0 :(得分:2)
听起来像StopWord所属的应用程序要么不在您安装的应用程序设置中,要么您没有运行syncdb来生成该表。
使用django cache framework可以模拟存储“全局值”。
# there is more to it then this - read the documentation
# settings.py needs to be configured.
from django.core.cache import cache
class StopWord(models.Model):
... # field definitions
@classmethod
def get_all_words(cls):
key = 'StopWord.AllCachedWords.Key'
words = cache.get(key)
if words is None:
words = list(StopWord.objects.values_list('word', flat=True))
cache.set(key, words)
return words
#elsewhere
from app.models import StopWord
for word in StopWord.get_all_words():
# do something
以上还处理了一种缓存失效。您的设置应设置默认超时,或者您可以将自己的超时设置为cache.set()
的第3个参数。这可以确保在您避免大多数数据库调用时,缓存将每隔一段时间刷新一次,因此可以使用新的停用词而无需重新启动应用程序。
答案 1 :(得分:1)
不要在全局范围内初始化查询。将None
绑定到名称,然后编写一个函数,首先检查值是否为None
,如果是,则生成数据,然后返回值。