Как лениво оценить вызов ORM после того, как приспособления загружаются в дб в Django?

У меня есть модуль 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 без кэша привел бы к слишком многим вызовам дб, которые я хочу предотвратить.

Это должно быть что-то очень простое, но я не могу разработать его.;-)

1
задан parxier 25 June 2010 в 16:11
поделиться

1 ответ

Я бы использовал функции вместо констант, но запомнил их:

_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') напрямую при необходимости.

2
ответ дан 2 September 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: