From 3b7c66a3ac0fcaa5dd02f87888c787d2c735c1a7 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] 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. --- 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 ad6cbd910c..48d45f70f1 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -1397,6 +1397,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).