summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-12-20 16:21:31 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2010-12-20 16:21:31 -0500
commit11f2bdff3171470a899ef684d2b833415ce791e5 (patch)
treebd031146d2f858e562a5056ee510b3ebeb46bf62 /lib/sqlalchemy
parent1bfaa104188d0205a49a2f5b633a07482ee97602 (diff)
downloadsqlalchemy-11f2bdff3171470a899ef684d2b833415ce791e5.tar.gz
- clean it up a bit
- don't need __set_composite_values__() - break the bad news about mutations
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/descriptor_props.py26
1 files changed, 18 insertions, 8 deletions
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()."""