From 761414a07be34aaebf76e7e35707c2d8d8772bb8 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 2 Jul 2013 18:02:20 -0400 Subject: 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] --- lib/sqlalchemy/ext/declarative/clsregistry.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'lib/sqlalchemy/ext') diff --git a/lib/sqlalchemy/ext/declarative/clsregistry.py b/lib/sqlalchemy/ext/declarative/clsregistry.py index 89975716d..ab2b5ad49 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) -- cgit v1.2.1