2009-10-28 2 views
1

J'ai un certain nombre de cartographes qui ressemblent à ceci:SQLAlchemy: relation dans cartographes compilation résultat de la fonction plutôt que d'appeler la fonction lorsque la relation est interrogé

mapper(Photo,photo_table, properties = { "locale": relation(PhotoContent, uselist=False, primaryjoin=and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang()), foreign_keys=[photo_content_table.c.photoId, photo_content_table.c.locale]) 

J'ai déployé dans Pylônes, la sorte que le get_lang() La fonction devrait retourner "en" ou "es" basé sur la session en cours.

from pylons.i18n import get_lang 

Le problème est que SA compile cette relation "locale" avec le résultat retourné par get_lang() au moment de la compilation. Donc si je fais quelque chose comme ceci:

meta.Session.query(Photo).options(eagerload('locale')).get(id) 

La relation n'appelle pas get_lang(). Il utilise simplement la valeur de get_lang() au moment de la compilation.

Quelqu'un at-il des idées pour implémenter SQLAlchemy eagerloaders qui sont dynamiques? Ce serait une bouée de sauvetage pour moi!

Répondre

2

Les instructions de relation sont exécutées lorsque la classe est chargée, ce qui signifie que chaque appel de fonction est évalué.

Essayez de passer la fonction à la place:

and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang) 

Notez la parenthèse manquante. Il devrait maintenant être évalué chaque fois que la relation est interrogée.

+0

Monsieur, je viens de faire mieux ma journée. Merci de bien vouloir. – Tony

Questions connexes