diff --git a/sqlalchemy_utils/functions/orm.py b/sqlalchemy_utils/functions/orm.py index 5621440..2909402 100644 --- a/sqlalchemy_utils/functions/orm.py +++ b/sqlalchemy_utils/functions/orm.py @@ -672,6 +672,9 @@ def get_descriptor(entity, attr): else: # Handle synonyms, relationship properties and hybrid # properties + + if isinstance(entity, sa.orm.util.AliasedClass): + return getattr(entity, attr) try: return getattr(mapper.class_, attr) except AttributeError: diff --git a/tests/__init__.py b/tests/__init__.py index 7b32bd5..afe0cc8 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -75,6 +75,15 @@ class TestCase(object): __tablename__ = 'category' id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.Unicode(255)) + title = sa.Column(sa.Unicode(255)) + + @hybrid_property + def full_name(self): + return u'%s %s' % (self.title, self.name) + + @full_name.expression + def full_name(self): + return sa.func.concat(self.title, ' ', self.name) @hybrid_property def articles_count(self): diff --git a/tests/test_sort_query.py b/tests/test_sort_query.py index d72ab09..221a47d 100644 --- a/tests/test_sort_query.py +++ b/tests/test_sort_query.py @@ -211,6 +211,23 @@ class TestSortQueryRelationshipCounts(TestCase): query = sort_query(query, '-categories-articles_count') assert_contains('ORDER BY (SELECT count(article.id) AS count_1', query) + def test_aliased_concat_hybrid_property(self): + alias = sa.orm.aliased( + self.Category, + name='aliased' + ) + query = ( + self.session.query(self.Article) + .outerjoin(alias, self.Article.category) + .options( + sa.orm.contains_eager(self.Article.category, alias=alias) + ) + ) + query = sort_query(query, 'aliased-full_name') + assert_contains( + 'concat(aliased.title, :param_1, aliased.name)', query + ) + class TestSortQueryWithPolymorphicInheritance(TestCase): """