From 11f2bdff3171470a899ef684d2b833415ce791e5 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 20 Dec 2010 16:21:31 -0500 Subject: - clean it up a bit - don't need __set_composite_values__() - break the bad news about mutations --- lib/sqlalchemy/orm/descriptor_props.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'lib/sqlalchemy/orm') diff --git a/lib/sqlalchemy/orm/descriptor_props.py b/lib/sqlalchemy/orm/descriptor_props.py index f9df47030..18c1081f3 100644 --- a/lib/sqlalchemy/orm/descriptor_props.py +++ b/lib/sqlalchemy/orm/descriptor_props.py @@ -104,23 +104,33 @@ class CompositeProperty(DescriptorProperty): self.deferred = kwargs.get('deferred', False) self.group = kwargs.get('group', None) - prop = self def fget(instance): - return prop.composite_class( - *[getattr(instance, prop.parent._columntoproperty[col].key) - for col in prop.columns] + # this could be optimized to store the value in __dict__, + # but more complexity and tests would be needed to pick + # up on changes to the mapped columns made independently + # of those on the composite. + return self.composite_class( + *[getattr(instance, key) for key in self._attribute_keys] ) + def fset(instance, value): if value is None: fdel(instance) else: - for col, value in zip(prop.columns, value.__composite_values__()): - setattr(instance, prop.parent._columntoproperty[col].key, value) + for key, value in zip(self._attribute_keys, value.__composite_values__()): + setattr(instance, key, value) def fdel(instance): - for col in prop.columns: - setattr(instance, prop.parent._columntoproperty[col].key, None) + for key in self._attribute_keys: + setattr(instance, key, None) self.descriptor = property(fget, fset, fdel) + + @util.memoized_property + def _attribute_keys(self): + return [ + self.parent._columntoproperty[col].key + for col in self.columns + ] def get_history(self, state, dict_, **kw): """Provided for userland code that uses attributes.get_history().""" -- cgit v1.2.1