SQLAlchemy: Beziehung in Mapper Ergebnis der Funktion kompilieren, anstatt die Funktion aufgerufen wird, wenn die Beziehung abgefragt

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

  •  08-07-2019
  •  | 
  •  

Frage

Ich habe eine Reihe von Mapper, die wie folgt aussehen:

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

ich in Pylons bereitgestellt habe, die so die get_lang () Funktion zurückkehren sollte entweder "en" oder "es" auf der Grundlage der aktuellen Sitzung.

from pylons.i18n import get_lang

Das Problem ist, dass SA kompiliert, dass „locale“ Beziehung mit dem Ergebnis von get_lang () zum Zeitpunkt der Kompilierung zurückgegeben. Also, wenn ich etwas tun, wie folgt aus:

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

Die Beziehung nicht nennen get_lang (). Es benutzt nur, was der Wert von get_lang () bei der Kompilierung war.

Wer irgendwelche Ideen, wie SQLAlchemy eagerloaders zu implementieren, die dynamisch sind? Dies würde für mich ein Lebensretter sein!

War es hilfreich?

Lösung

Die Beziehung Anweisungen werden ausgeführt, wenn die Klasse geladen wird, was bedeutet, wird jeder Funktionsaufruf ausgewertet.

Versuchen Sie, die Funktion übergeben statt:

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

Beachten Sie die fehlende Klammer. Es sollte nun ausgewertet erhalten, wenn die Beziehung abgefragt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top