SQLAlchemy: отношение в мапперах компилирует результат функции, а не вызывает функцию при запросе отношения

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top