Django全局查询集

时间:2010-12-22 20:52:42

标签: django django-models

我想在我的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")

我不知道怎么摆脱这个,可能是我走错了路?

2 个答案:

答案 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,如果是,则生成数据,然后返回值。