diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-01-16 22:06:15 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-01-16 22:06:15 +0000 |
commit | 55c0ab5b2b7947bcaeab24a573c646b68d856bad (patch) | |
tree | f5e6bda0626b4a0229d6767f1d656f06d02c16a8 /lib/sqlalchemy/orm/dynamic.py | |
parent | 626e83dc28e5ec157c28a54920827d401726cab7 (diff) | |
download | sqlalchemy-55c0ab5b2b7947bcaeab24a573c646b68d856bad.tar.gz |
- dynamic relations, when referenced, create a strong
reference to the parent object so that the query
still has a parent to call against even if the
parent is only created (and otherwise dereferenced)
within the scope of a single expression [ticket:938]
Diffstat (limited to 'lib/sqlalchemy/orm/dynamic.py')
-rw-r--r-- | lib/sqlalchemy/orm/dynamic.py | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/lib/sqlalchemy/orm/dynamic.py b/lib/sqlalchemy/orm/dynamic.py index fe781ab05..a5e1a8467 100644 --- a/lib/sqlalchemy/orm/dynamic.py +++ b/lib/sqlalchemy/orm/dynamic.py @@ -80,15 +80,14 @@ class DynamicAttributeImpl(attributes.AttributeImpl): class AppenderQuery(Query): def __init__(self, attr, state): super(AppenderQuery, self).__init__(attr.target_mapper, None) - self.state = state + self.instance = state.obj() self.attr = attr def __session(self): - instance = self.state.obj() - sess = object_session(instance) - if sess is not None and self.autoflush and sess.autoflush and instance in sess: + sess = object_session(self.instance) + if sess is not None and self.autoflush and sess.autoflush and self.instance in sess: sess.flush() - if not has_identity(instance): + if not has_identity(self.instance): return None else: return sess @@ -100,21 +99,21 @@ class AppenderQuery(Query): def __iter__(self): sess = self.__session() if sess is None: - return iter(self.attr._get_collection(self.state, passive=True).added_items) + return iter(self.attr._get_collection(self.instance._state, passive=True).added_items) else: return iter(self._clone(sess)) def __getitem__(self, index): sess = self.__session() if sess is None: - return self.attr._get_collection(self.state, passive=True).added_items.__getitem__(index) + return self.attr._get_collection(self.instance._state, passive=True).added_items.__getitem__(index) else: return self._clone(sess).__getitem__(index) def count(self): sess = self.__session() if sess is None: - return len(self.attr._get_collection(self.state, passive=True).added_items) + return len(self.attr._get_collection(self.instance._state, passive=True).added_items) else: return self._clone(sess).count() @@ -122,7 +121,7 @@ class AppenderQuery(Query): # note we're returning an entirely new Query class instance here # without any assignment capabilities; # the class of this query is determined by the session. - instance = self.state.obj() + instance = self.instance if sess is None: sess = object_session(instance) if sess is None: @@ -134,19 +133,19 @@ class AppenderQuery(Query): return sess.query(self.attr.target_mapper).with_parent(instance, self.attr.key) def assign(self, collection): - instance = self.state.obj() + instance = self.instance if has_identity(instance): oldlist = list(self) else: oldlist = [] - self.attr._get_collection(self.state, passive=True).replace(oldlist, collection) + self.attr._get_collection(self.instance._state, passive=True).replace(oldlist, collection) return oldlist def append(self, item): - self.attr.append(self.state, item, None) + self.attr.append(self.instance._state, item, None) def remove(self, item): - self.attr.remove(self.state, item, None) + self.attr.remove(self.instance._state, item, None) class CollectionHistory(object): |