summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-12-11 17:29:08 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-12-11 17:29:08 +0000
commitedbfbf81f7ffa4f38e086e51d8efbde7230e0f28 (patch)
tree170676befd3b816361a4d31d86643c95c2619d82 /lib/sqlalchemy
parentc468a274442d8d8dbf0ec2cd1182143278033500 (diff)
downloadsqlalchemy-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.py4
-rw-r--r--lib/sqlalchemy/orm/properties.py9
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):