Python 在Django中将fixture加载到db之后,如何惰性地评估ORM调用?
我有一个模块Python 在Django中将fixture加载到db之后,如何惰性地评估ORM调用?,python,django,unit-testing,lazy-loading,fixtures,Python,Django,Unit Testing,Lazy Loading,Fixtures,我有一个模块pagetypes.py,它从数据库中提取了几个常量(我不应该在这里使用单词constant),以便以后重用: 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
pagetypes.py
,它从数据库中提取了几个常量(我不应该在这里使用单词constant),以便以后重用:
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有这些记录时,一切都很好,我确保它有。。。除非该代码正在测试中。在这种情况下,我希望通过fixture将这些记录加载到db中。问题是在导入pagetypes模块时没有加载装置(甚至没有运行syncdb
),导致\u get\u page\u type\u调用失败,原因是:
psycopg2.ProgrammingError: relation "pagetype" does not exist
测试运行程序总是尝试导入pagetypes
模块,因为它是由正在测试的视图导入的
我该如何避开这个问题
我曾考虑过延迟加载pagetype常量pagetype\uMain
,pagetype\uOther
,但如果这些记录不在db中(或测试中的装置),我希望它能尽早失败,所以我真的不知道如何实现这一点
我也在考虑对象级缓存,只要在使用/调用常量时调用PageType.objects.get(type=type)
,这不是一种过分的做法吗?在没有缓存的情况下调用orm会导致太多的db调用,这是我想要防止的
这一定很简单,但我解不出来 我会使用函数而不是常量,但要记住它们:
_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\u page\u type('Main')
。这很聪明,也很简单。每次我想使用page type常量时,我都会稍微修改您的代码,以减少键入的次数:page\u type\u Main=property(lambda:get\u page\u type('Main'))
我使用了中的一些代码使属性在模块级工作。很好,谢谢!