У меня есть модуль 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
Все это хорошо работает, когда дб имеет те записи, и я удостоверяюсь, что это делает..., если этот код не находится под тестом. В этом случае я хочу загрузить те записи в дб через приспособления. Проблема с этим состоит в том, что приспособления не загружаются (даже syncdb
не выполняется) к тому времени, когда pagetypes модуль импортируется, приводя к _get_page_type_
назовите сбой с:
psycopg2.ProgrammingError: relation "pagetype" does not exist
Исполнитель тестов всегда пытается импортировать pagetypes
модуль, потому что это импортируется представлением, которое находится под тестом.
Как я обхожу эту проблему?
Я думал о ленивой загрузке pagetype константы 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')
напрямую при необходимости.