From 76979a257d289b99998c463023308c888662d874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anssi=20K=C3=A4=C3=A4ri=C3=A4inen?= Date: Mon, 5 May 2014 15:22:01 +0300 Subject: [PATCH] [1.7.x] Fixed #22466 -- ordering by reverse foreign key Ordering by reverse foreign key was broken by custom lookups patch (commit 20bab2cf9d02a5c6477d8aac066a635986e0d3f3). Thanks to everybody who helped solving this issue. Special thanks to Trac alias takis for reporting this. Backport of 3b7c66a3ac from master --- django/db/models/sql/query.py | 2 ++ tests/queries/tests.py | 12 ++++++++++++ 2 files changed, 14 insertions(+) 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).