SQLAlchemy: la relación en los mapeadores compila el resultado de la función en lugar de llamar a la función cuando se consulta la relación
-
08-07-2019 - |
Pregunta
Tengo varios mapeadores que se ven así:
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])
Me he desplegado en Pylons, por lo que la función get_lang () debería devolver " en " o "es" basado en la sesión actual.
from pylons.i18n import get_lang
El problema es que SA compila ese " locale " relación con el resultado devuelto por get_lang () en tiempo de compilación. Entonces, si hago algo como esto:
meta.Session.query(Photo).options(eagerload('locale')).get(id)
La relación no llama a get_lang (). Simplemente usa el valor de get_lang () en tiempo de compilación.
¿Alguien tiene alguna idea de cómo implementar SQLAlchemy eagerloaders que son dinámicos? ¡Esto sería un salvavidas para mí!
Solución
Las declaraciones de relación se ejecutan cuando se carga la clase, lo que significa que se evalúa cada llamada de función.
Intente pasar la función en su lugar:
and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang)
Tenga en cuenta el paréntesis faltante. Ahora debe evaluarse cada vez que se consulta la relación.