summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-05-13 15:36:22 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-05-13 15:36:22 -0400
commite352e255a749b6e75e18bd41bf6646eeea345442 (patch)
treebb96b73fdfef54a85e865268a49e4bdb760a0690 /lib
parent0a8f2207f0874c9639a2968e18bce88e6cb55c69 (diff)
downloadsqlalchemy-e352e255a749b6e75e18bd41bf6646eeea345442.tar.gz
- fixed __setstate__ method of CollectionAdapter to not
fail during deserialize where parent InstanceState not yet unserialized. [ticket:1802]
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/orm/collections.py21
1 files changed, 13 insertions, 8 deletions
diff --git a/lib/sqlalchemy/orm/collections.py b/lib/sqlalchemy/orm/collections.py
index 58b383a29..0ea17cd8b 100644
--- a/lib/sqlalchemy/orm/collections.py
+++ b/lib/sqlalchemy/orm/collections.py
@@ -471,15 +471,20 @@ class CollectionAdapter(object):
"""
def __init__(self, attr, owner_state, data):
- self.attr = attr
- # TODO: figure out what this being a weakref buys us
+ self._key = attr.key
self._data = weakref.ref(data)
self.owner_state = owner_state
self.link_to_self(data)
-
- data = property(lambda s: s._data(),
- doc="The entity collection being adapted.")
-
+
+ @property
+ def data(self):
+ "The entity collection being adapted."
+ return self._data()
+
+ @util.memoized_property
+ def attr(self):
+ return self.owner_state.manager[self._key].impl
+
def link_to_self(self, data):
"""Link a collection to this adapter, and fire a link event."""
setattr(data, '_sa_adapter', self)
@@ -619,12 +624,12 @@ class CollectionAdapter(object):
initiator=initiator)
def __getstate__(self):
- return {'key': self.attr.key,
+ return {'key': self._key,
'owner_state': self.owner_state,
'data': self.data}
def __setstate__(self, d):
- self.attr = getattr(d['owner_state'].obj().__class__, d['key']).impl
+ self._key = d['key']
self.owner_state = d['owner_state']
self._data = weakref.ref(d['data'])