SQLAlchemy: отношение в мапперах компилирует результат функции, а не вызывает функцию при запросе отношения
-
08-07-2019 - |
Вопрос
У меня есть несколько картографов, которые выглядят так:
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? Это было бы спасением для меня!
Решение
Операторы отношения выполняются при загрузке класса, что означает, что каждый вызов функции оценивается.
Попробуйте вместо этого передать функцию:
and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang)
Обратите внимание на пропущенные скобки. Теперь он должен оцениваться всякий раз, когда запрашивается отношение.