[英]Access parent object from sqlalchemy association_proxy creator
[英]Session in association_proxy creator
我使用SQLAlchemy 0.5和Python 2.6.6。
我想在association_proxy的创建者中选择或创建一个引用的对象。 我的问题是,为此我需要一个会话,但是我不知道在创建者回调中从何处获取它。
如何在对象的关联代理的创建者之一中使用对象所属的会话?
我尝试过的方法不起作用
我已经找到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)
我可以将对象本身传递给创建者函数吗? 在这种情况下,我可以在该对象上调用object_session。
我的项目使用多个会话,因此,我必须确定创建者执行时的具体会话。
此问题在SQLAlchemy 0.7中也仍然存在。 我在稍有不同的情况下遇到了相同的问题。 因为associationproxy是Python描述符,并且描述符在类级别运行,所以您不能为创建者函数提供对绑定方法的引用(该方法在实例级别运行)。
我得出以下解决方案:
我的代码如下所示:
def find_object(name):
# Because we can't get a grip on the actual session we instead use a global
# session for querying this instance.
session = Session()
obj = Model.query(session).filter_by(name=name).first()
# We also have to dump the reference to that session, so the created object
# can be used on other sessions.
session.expunge(obj)
# We don't need that session any more.
session.close()
return obj
我认为您需要的是一种验证方法:
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 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.