1

我有一个模块pagetypes.py,它从数据库中提取几个常量(我不应该在这里真正使用单词常量)以供以后重用:

def _get_page_type_(type):
    return PageType.objects.get(type=type)

PAGE_TYPE_MAIN = _get_page_type_('Main')
PAGE_TYPE_OTHER = _get_page_type_('Other')

然后在我做的视图中的某个地方:

import pagetypes
...
print pagetypes.PAGE_TYPE_MAIN #simplified

当 db 有这些记录时,一切正常,我确保它确实如此......除非这段代码正在测试中。在这种情况下,我想通过固定装置将这些记录加载到数据库中。这样做的问题是,syncdb在导入 pagetypes 模块时未加载(甚至未运行)固定装置,导致_get_page_type_调用失败:

psycopg2.ProgrammingError: relation "pagetype" does not exist

测试运行器总是尝试导入pagetypes模块,因为它是由正在测试的视图导入的。

我该如何解决这个问题?

我正在考虑延迟加载 pagetype constants PAGE_TYPE_MAINPAGE_TYPE_OTHER但是如果这些记录不在数据库中(或者在测试中的固定装置中),我希望它尽早失败,所以我真的不知道如何实现这一点。

我也在考虑对象级缓存,只要PageType.objects.get(type=type)使用/调用常量就调用,但这不是矫枉过正吗?在没有缓存的情况下调用 orm 会导致太多的数据库调用,我想防止这种情况发生。

它一定很简单,但我无法解决。;-)

4

1 回答 1

2

我会使用函数而不是常量,但要记住它们:

_cache = {}

def get_page_type(type_name):
    if type_name not in _cache:
        _cache[type_name] = PageType.objects.get(type=type_name)
    return _cache[type_name]

所以现在你会get_page_type('Main')在必要时直接打电话。

于 2010-06-25T17:37:48.067 回答