diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-12-11 17:29:08 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-12-11 17:29:08 +0000 |
| commit | edbfbf81f7ffa4f38e086e51d8efbde7230e0f28 (patch) | |
| tree | 170676befd3b816361a4d31d86643c95c2619d82 /lib/sqlalchemy | |
| parent | c468a274442d8d8dbf0ec2cd1182143278033500 (diff) | |
| download | sqlalchemy-edbfbf81f7ffa4f38e086e51d8efbde7230e0f28.tar.gz | |
- fix to cascades on polymorphic relations, such that cascades
from an object to a polymorphic collection continue cascading
along the set of attributes specific to each element in the collection.
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/properties.py | 9 |
2 files changed, 8 insertions, 5 deletions
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 0f5dbaaf5..e9fe41fdc 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1538,8 +1538,8 @@ def has_mapper(object): return hasattr(object, '_entity_name') -def _state_mapper(state): - return state.class_._class_state.mappers[state.dict.get('_entity_name', None)] +def _state_mapper(state, entity_name=None): + return state.class_._class_state.mappers[state.dict.get('_entity_name', entity_name)] def object_mapper(object, entity_name=None, raiseerror=True): """Given an object, return the primary Mapper associated with the object instance. diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 9394e9aea..4d41556a0 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -13,7 +13,7 @@ to handle flush-time dependency sorting and processing. from sqlalchemy import sql, schema, util, exceptions, logging from sqlalchemy.sql import util as sql_util, visitors, operators, ColumnElement -from sqlalchemy.orm import mapper, sync, strategies, attributes, dependency +from sqlalchemy.orm import mapper, sync, strategies, attributes, dependency, object_mapper from sqlalchemy.orm import session as sessionlib from sqlalchemy.orm import util as mapperutil from sqlalchemy.orm.interfaces import StrategizedProperty, PropComparator, MapperProperty @@ -365,8 +365,11 @@ class PropertyLoader(StrategizedProperty): if not isinstance(c, self.mapper.class_): raise exceptions.AssertionError("Attribute '%s' on class '%s' doesn't handle objects of type '%s'" % (self.key, str(self.parent.class_), str(c.__class__))) recursive.add(c) - yield (c, mapper) - for (c2, m) in mapper.cascade_iterator(type, c._state, recursive): + + # cascade using the mapper local to this object, so that its individual properties are located + instance_mapper = object_mapper(c, entity_name=mapper.entity_name) + yield (c, instance_mapper) + for (c2, m) in instance_mapper.cascade_iterator(type, c._state, recursive): yield (c2, m) def _get_target_class(self): |
