diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 6814af6439..cb94989a05 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1432,6 +1432,8 @@ class Query(object): alias = self.join( connection, reuse=reuse, nullable=nullable, join_field=join.join_field) joins.append(alias) + if hasattr(final_field, 'field'): + final_field = final_field.field return final_field, targets, opts, joins, path def trim_joins(self, targets, joins, path): diff --git a/tests/queries/tests.py b/tests/queries/tests.py index 27d4f447bb..8e9354ed50 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -1396,6 +1396,18 @@ class Queries4Tests(BaseQuerysetTest): qs = Author.objects.order_by().order_by('name') self.assertTrue('ORDER BY' in qs.query.get_compiler(qs.db).as_sql()[0]) + def test_order_by_reverse_fk(self): + # It is possible to order by reverse of foreign key, although that can lead + # to duplicate results. + c1 = SimpleCategory.objects.create(name="category1") + c2 = SimpleCategory.objects.create(name="category2") + CategoryItem.objects.create(category=c1) + CategoryItem.objects.create(category=c2) + CategoryItem.objects.create(category=c1) + self.assertQuerysetEqual( + SimpleCategory.objects.order_by('categoryitem', 'pk'), + [c1, c2, c1], lambda x: x) + def test_ticket10181(self): # Avoid raising an EmptyResultSet if an inner query is probably # empty (and hence, not executed).