diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-07-02 18:02:20 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-07-02 18:02:20 -0400 |
| commit | 0e219f2eff8954e20d8e3cdae59431da2676b6f4 (patch) | |
| tree | c558aadf71b61e30f7d8a60161594da97127539b /lib/sqlalchemy/ext/declarative | |
| parent | faa2b43c6ccaaefd90a37512fed1bb5b75c133b8 (diff) | |
| download | sqlalchemy-0e219f2eff8954e20d8e3cdae59431da2676b6f4.tar.gz | |
ORM descriptors such as hybrid properties can now be referenced
by name in a string argument used with ``order_by``,
``primaryjoin``, or similar in :func:`.relationship`,
in addition to column-bound attributes. [ticket:2761]
Diffstat (limited to 'lib/sqlalchemy/ext/declarative')
| -rw-r--r-- | lib/sqlalchemy/ext/declarative/clsregistry.py | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/lib/sqlalchemy/ext/declarative/clsregistry.py b/lib/sqlalchemy/ext/declarative/clsregistry.py index 95aba93fa..a669e37f4 100644 --- a/lib/sqlalchemy/ext/declarative/clsregistry.py +++ b/lib/sqlalchemy/ext/declarative/clsregistry.py @@ -12,7 +12,7 @@ This system allows specification of classes and expressions used in from ...orm.properties import ColumnProperty, RelationshipProperty, \ SynonymProperty from ...schema import _get_table_key -from ...orm import class_mapper +from ...orm import class_mapper, interfaces from ... import util from ... import exc import weakref @@ -190,19 +190,21 @@ class _GetColumns(object): def __getattr__(self, key): mp = class_mapper(self.cls, configure=False) if mp: - if not mp.has_property(key): + if key not in mp.all_orm_descriptors: raise exc.InvalidRequestError( "Class %r does not have a mapped column named %r" % (self.cls, key)) - prop = mp.get_property(key) - if isinstance(prop, SynonymProperty): - key = prop.name - elif not isinstance(prop, ColumnProperty): - raise exc.InvalidRequestError( - "Property %r is not an instance of" - " ColumnProperty (i.e. does not correspond" - " directly to a Column)." % key) + desc = mp.all_orm_descriptors[key] + if desc.extension_type is interfaces.NOT_EXTENSION: + prop = desc.property + if isinstance(prop, SynonymProperty): + key = prop.name + elif not isinstance(prop, ColumnProperty): + raise exc.InvalidRequestError( + "Property %r is not an instance of" + " ColumnProperty (i.e. does not correspond" + " directly to a Column)." % key) return getattr(self.cls, key) |
