Как лениво оценить вызов ORM после того, как в Django загружены приборы в Db? - PullRequest
1 голос
/ 25 июня 2010

У меня есть модуль 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')

затем где-то в представлениях Ido:

import pagetypes
...
print pagetypes.PAGE_TYPE_MAIN #simplified

Все работает нормально, когда в db есть эти записи, и я уверен, что так и есть ... если этот код не тестируется.В этом случае я хочу загрузить эти записи в БД через светильники.Проблема в том, что приборы не загружаются (даже syncdb не запускается) к моменту импорта модуля pagetypes, что приводит к сбою _get_page_type_ с:

psycopg2.ProgrammingError: relation "pagetype" does not exist

Тестовый исполнитель всегда пытается импортироватьМодуль pagetypes, потому что он импортируется проверяемым представлением.

Как мне обойти эту проблему?

Я думал о ленивой загрузке констант типа страницы PAGE_TYPE_MAIN, PAGE_TYPE_OTHER, но потом я хочу, чтобы она провалилась раньше, если эти записи не находятся вдБ (или приборы, если тестируются), поэтому я не знаю, как это реализовать.

Я также думал о кэшировании на уровне объектов и просто вызывал PageType.objects.get(type=type) всякий раз, когда используется / вызывается константа, ноне будет ли это излишним?Вызов orm без кэша приведет к слишком большому количеству вызовов в БД, которые я хочу предотвратить.

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

1 Ответ

2 голосов
/ 25 июня 2010

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

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

...