1

我有一些看起来像这样的映射器:

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 eagerloaders?这对我来说是救命稻草!

4

1 回答 1

2

加载类时会执行关系语句,这意味着每个函数调用都会被评估。

尝试传递函数:

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

注意缺少的括号。现在,只要查询关系,就应该对其进行评估。

于 2009-10-28T17:41:53.917 回答