diff options
Diffstat (limited to 'lib/sqlalchemy/ext/declarative/api.py')
-rw-r--r-- | lib/sqlalchemy/ext/declarative/api.py | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/lib/sqlalchemy/ext/declarative/api.py b/lib/sqlalchemy/ext/declarative/api.py index 251b06fed..d4450da58 100644 --- a/lib/sqlalchemy/ext/declarative/api.py +++ b/lib/sqlalchemy/ext/declarative/api.py @@ -172,7 +172,7 @@ class declared_attr(interfaces._MappedAttribute, property): def property(cls): return _declared_property - defer_defer_defer = False + should_resolve_late = False class _memoized_declared_attr(declared_attr): @@ -182,7 +182,7 @@ class _memoized_declared_attr(declared_attr): self._cascading = cascading def __get__(desc, self, cls): - if desc.defer_defer_defer: + if desc.should_resolve_late: return desc elif cls in desc.reg: return desc.reg[cls] @@ -190,6 +190,18 @@ class _memoized_declared_attr(declared_attr): desc.reg[cls] = obj = desc.fget(cls) return obj + def resolve_early(self, cls, name): + if not self._cascading: + return getattr(cls, name) + else: + return self.__get__(self, cls) + + def resolve_late(self, cls, name): + if self.should_resolve_late: + return self.fget(cls) + else: + raise NotImplementedError() + @classproperty def cascading(cls): return lambda decorated: cls(decorated, cascading=True) @@ -200,8 +212,7 @@ class _declared_column(_memoized_declared_attr): class _declared_property(_memoized_declared_attr): - defer_defer_defer = True - + should_resolve_late = True def declarative_base(bind=None, metadata=None, mapper=None, cls=object, @@ -433,6 +444,12 @@ class AbstractConcreteBase(ConcreteBase): pjoin = cls._create_polymorphic_union(mappers) cls.__mapper__ = m = mapper(cls, pjoin, polymorphic_on=pjoin.c.type) + for base in cls.__mro__: + for name, obj in vars(base).items(): + if isinstance(obj, _memoized_declared_attr) \ + and obj._cascading: + m.add_property(name, obj.resolve_late(cls, name)) + for scls in cls.__subclasses__(): sm = _mapper_or_none(scls) if sm.concrete and cls in scls.__bases__: |