python - 在 Django 中将固定装置加载到数据库后如何延迟评估 ORM 调用?

标签 python django unit-testing lazy-loading fixtures

我有一个模块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_MAINPAGE_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/

相关文章:

python - Django 查询 : Group by field and get the latest entry per group

django - 从超过 max_retries 失败的任务中恢复

unit-testing - Lucene 索引的单元测试

php - 设置可访问性在使用它时不会使私有(private)属性可访问它 mock

python - 在Python中打印引号

python - Ironpython:函数在 CPython 中工作,IronPython 中神秘的空指针异常

python - 查询任务 ':app:compileDebugJavaWithJavac'属性 'options.generatedSourceOutputDirectory'的值失败

Python Django 测试两个异常之一

c# - 使用不同的凭据运行 NUnit 集成测试

python - 将 CitusDB 与 SQL-alchemy 结合使用