SQLAlchemy: отношение в мапперах компилирует результат функции, а не вызывает функцию при запросе отношения - PullRequest
1 голос
/ 28 октября 2009

У меня есть несколько картографов, которые выглядят так:

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

Я развернул в Pylons, поэтому функция get_lang () должна возвращать либо «en», либо «es» в зависимости от текущегосеанс.

from pylons.i18n import get_lang

Проблема заключается в том, что SA компилирует это «языковое» отношение с результатом, возвращаемым get_lang () во время компиляции.Поэтому, если я сделаю что-то вроде этого:

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

Отношение не вызывает get_lang ().Он просто использует любое значение get_lang (), которое было во время компиляции.

У кого-нибудь есть идеи, как реализовать динамические загрузчики SQLAlchemy?Это было бы спасением для меня!

1 Ответ

2 голосов
/ 28 октября 2009

Операторы отношения выполняются при загрузке класса, что означает, что каждый вызов функции оценивается.

Попробуйте вместо этого передать функцию:

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

Обратите внимание на пропущенные скобки. Теперь он должен оцениваться всякий раз, когда запрашивается отношение.

...