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

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

  •  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í!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top