我使用 SQLAlchemy 0.5 和 Python 2.6.6。
我想在 association_proxy 的创建者中选择或创建一个引用对象。我的问题是,我为此需要一个 session ,但我不知道在创建者回调中从哪里获取它。
我如何在其关联代理的创建者之一中使用对象所属的 session ?
我试过的,没用
我找到了 session.object_session
,但回调中没有任何对象,除非它是我的 ORM 对象的一部分。如果它是我的对象的一部分,调用者将不会作为方法被调用(第一个参数是代理的值,而不是对象的引用):
class Event(ManagerBase):
# If association_proxy calls this, 'self' is the key, not the
# reference to the calling instance.
def _field_find_or_create(self, key, val):
session = session.object_session(self)
field = session.query(Field).filter_by(name=key).first()
if not field:
field = Field(name=key)
return EventFieldValue(field=field, value=val)
fields = association_proxy("field_values", "value",
creator=_field_find_or_create)
我可以将对象本身传递给 creators 函数吗?在这种情况下,我可以对该对象调用 object_session。
我的项目使用多个 session ,因此我必须确定创建者执行的具体 session 。
最佳答案
我想你需要的是一个验证方法:
from sqlalchemy.orm import validates, object_session
class Event(ManagerBase):
value = relationship(FieldValue)
fields = association_proxy("field_values", "value",
creator=lambda group: FieldValue(value=value))
@validates("field_values")
def _validate_field_values(self, key, value):
session = object_session(self)
if session is not None:
v = value.value
with session.no_autoflush:
uvalue = session.query(FieldValue) \
.filter_by(name=a) \
.first()
if uvalue:
session.expunge(value)
return ugroup
return value
学分转到https://groups.google.com/forum/#!topic/sqlalchemy/RMDI1SnGhd0 .
关于python - association_proxy 创建者中的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11153474/