我有一个模块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_MAIN
,PAGE_TYPE_OTHER
但是如果这些记录不在数据库中(或者在测试中的固定装置中),我希望它尽早失败,所以我真的不知道如何实现这一点。
我也在考虑对象级缓存,只要PageType.objects.get(type=type)
使用/调用常量就调用,但这不是矫枉过正吗?在没有缓存的情况下调用 orm 会导致太多的数据库调用,我想防止这种情况发生。
它一定很简单,但我无法解决。;-)