SQLAlchemy: la relazione nei mappatori compila il risultato della funzione anziché chiamarla quando viene eseguita la query

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

  •  08-07-2019
  •  | 
  •  

Domanda

Ho un numero di mappatori che assomigliano a questo:

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])

Ho implementato in Pylons, quindi la funzione get_lang () dovrebbe restituire " en " o " es " basato sulla sessione corrente.

from pylons.i18n import get_lang

Il problema è che SA compila quella "local" " relazione con il risultato restituito da get_lang () al momento della compilazione. Quindi se faccio qualcosa del genere:

meta.Session.query(Photo).options(eagerload('locale')).get(id)

La relazione non chiama get_lang (). Usa semplicemente qualunque sia il valore di get_lang () al momento della compilazione.

Qualcuno ha qualche idea su come implementare i caricatori SQLAlchemy dinamici? Questo sarebbe un vero toccasana per me!

È stato utile?

Soluzione

Le istruzioni di relazione vengono eseguite quando viene caricata la classe, il che significa che viene valutata ogni chiamata di funzione.

Prova invece a passare la funzione:

and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang)

Nota la parentesi mancante. Ora dovrebbe essere valutato ogni volta che viene interrogata la relazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top