SQLAlchemy: la relation dans les mappeurs compile le résultat de la fonction plutôt que d'appeler la fonction lorsque la relation est interrogée

StackOverflow https://stackoverflow.com/questions/1638751

  •  08-07-2019
  •  | 
  •  

Question

J'ai un certain nombre de mappeurs qui ressemblent à ceci:

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 les pylônes, la fonction get_lang () doit donc renvoyer soit " en " ou "es" en fonction de la session en cours.

from pylons.i18n import get_lang

Le problème est que SA compile cet "environnement local". relation avec le résultat renvoyé par get_lang () lors de la compilation. Donc, si je fais quelque chose comme ça:

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 une idée de la manière de mettre en œuvre des chargeurs dynamiques SQLAlchemy? Ce serait une bouée de sauvetage pour moi!

Était-ce utile?

La solution

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 transmettre 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. Elle devrait maintenant être évaluée chaque fois que la relation est interrogée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top