我有一个模块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')
然后我在 View 中的某个地方:
import pagetypes
...
print pagetypes.PAGE_TYPE_MAIN #simplified
当数据库有这些记录时一切正常,并且我确保它确实如此......除非此代码正在测试中。在这种情况下,我想通过固定装置将这些记录加载到数据库中。问题在于,在导入 pagetypes 模块时,固定装置尚未加载(甚至 syncdb
未运行),导致 _get_page_type_
调用失败,并显示:
psycopg2.ProgrammingError: relation "pagetype" does not exist
测试运行器始终尝试导入pagetypes
模块,因为它是由正在测试的 View 导入的。
如何解决这个问题?
我正在考虑延迟加载页面类型常量PAGE_TYPE_MAIN
、PAGE_TYPE_OTHER
,但是如果这些记录不在数据库中(或者固定装置,如果在测试),所以我真的不知道如何实现这个。
我也在考虑对象级缓存,只要使用/调用常量就调用 PageType.objects.get(type=type)
,但这不是一种矫枉过正吗?在没有缓存的情况下调用 orm 会导致过多的数据库调用,这是我想防止的。
这一定是非常简单的事情,但我无法解决。 ;-)
最佳答案
我会使用函数而不是常量,但要记住它们:
_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')
。
关于python - 在 Django 中将固定装置加载到数据库后如何延迟评估 ORM 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3119606/