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. ;-)
C'est assez intelligent et simple. – googletorp
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