summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/ext/declarative
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-07-02 18:02:20 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2013-07-02 18:02:20 -0400
commit0e219f2eff8954e20d8e3cdae59431da2676b6f4 (patch)
treec558aadf71b61e30f7d8a60161594da97127539b /lib/sqlalchemy/ext/declarative
parentfaa2b43c6ccaaefd90a37512fed1bb5b75c133b8 (diff)
downloadsqlalchemy-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.py22
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)