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イーガーローダーを実装する方法を知っている人はいますか?これは私にとって命の恩人になるでしょう!

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 に答える