SQLAlchemy: relação em mapeadores compilar resultado de função em vez de chamar a função quando a relação é consultado
-
08-07-2019 - |
Pergunta
Eu tenho um número de mapeadores que olhar como esta:
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])
Eu ter implantado em Pilões, a assim a função get_lang () deve retornar tanto "en" ou "es", baseado na sessão atual.
from pylons.i18n import get_lang
O problema é que SA compila essa relação "locale" com o resultado retornado por get_lang () em tempo de compilação. Então, se eu fizer algo como isto:
meta.Session.query(Photo).options(eagerload('locale')).get(id)
A relação não chama get_lang (). Apenas usa qualquer que seja o valor da get_lang () foi em tempo de compilação.
Alguém tem alguma idéia como implementar eagerloaders SQLAlchemy que são dinâmicos? Este seria um salva-vidas para mim!
Solução
As afirmações de relação é executado quando a classe é carregada, o que significa cada chamada função é avaliada.
Tente passar a função em vez disso:
and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang)
Observe o parêntese ausente. Ele deve agora obter avaliados sempre que a relação fica consultado.