2010-06-25 18 views
1

J'ai un module pagetypes.py qui extrait deux constantes de la db pour une réutilisation ultérieure (je ne devrais pas vraiment utiliser mot constant ici):Comment évaluer paresseusement un appel ORM après que les projecteurs ont été chargés dans db dans Django?

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') 

alors quelque part dans les vues que je fais:

import pagetypes 
... 
print pagetypes.PAGE_TYPE_MAIN #simplified 

Tout fonctionne bien quand DB a ces enregistrements et je m'assure qu'il le fait ... sauf si ce code est en cours de test. Dans ce cas, je veux charger ces enregistrements dans db via des appareils. Le problème qui est que les appareils ne sont pas chargés (même syncdb est pas exécuté) par le temps module pagetypes est importé pour résultat _get_page_type_ appel échoue avec:

psycopg2.ProgrammingError: relation "pagetype" does not exist 

coureur de test essaie toujours d'importer pagetypes module, car il est importé par vue en cours de test.

Comment contourner ce problème?

Je pensais paresseusement le chargement des constantes pagetype PAGE_TYPE_MAIN, PAGE_TYPE_OTHER, mais je veux échouer tôt si ces documents ne sont pas dans la db (ou les appareils si l'essai), donc je ne sais pas vraiment comment mettre en œuvre ce.

Je pensais aussi à la mise en cache au niveau de l'objet et j'appelle simplement PageType.objects.get(type=type) chaque fois qu'une constante est utilisée/appelée, mais cela ne serait-il pas excessif? Appeler orm sans cache entraînerait trop d'appels db, que je veux empêcher.

Ce doit être quelque chose de très simple, mais je ne peux pas le résoudre. ;-)

Répondre

2

Je voudrais utiliser les fonctions au lieu des constantes, mais les memoize:

_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] 

Alors maintenant, vous appelleriez get_page_type('Main') directement en cas de besoin.

+0

C'est assez intelligent et simple. – googletorp

+0

J'ai légèrement modifié votre code pour faire moins taper chaque fois que je veux utiliser le type de page constante: 'PAGE_TYPE_MAIN = propriété:' (lambda get_page_type ('Main')) J'utilise un code de http: // stackoverflow.com/questions/880530/can-python-modules-have-properties-the-ame-way-that-objects-peut faire fonctionner 'property' au niveau du module. Fonctionne bien, merci! – parxier