Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中将fixture加载到db之后,如何惰性地评估ORM调用?_Python_Django_Unit Testing_Lazy Loading_Fixtures - Fatal编程技术网

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'))
我使用了中的一些代码使
属性在模块级工作。很好,谢谢!