SQLAlchemy: relação em mapeadores compilar resultado de função em vez de chamar a função quando a relação é consultado

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

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top