From 2162f0983de0dfe2178531638ce7ea56f54dd4e7 Mon Sep 17 00:00:00 2001 From: Matthew Wilkes Date: Sun, 18 Jun 2017 16:53:40 +0100 Subject: Fixed #24747 -- Allowed transforms in QuerySet.order_by() and distinct(*fields). --- tests/postgres_tests/test_array.py | 16 ++++++++++++++++ tests/postgres_tests/test_hstore.py | 12 ++++++++++++ tests/postgres_tests/test_json.py | 25 +++++++++++++++++++++++++ 3 files changed, 53 insertions(+) (limited to 'tests/postgres_tests') diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py index 4776bda934..03ffa4d637 100644 --- a/tests/postgres_tests/test_array.py +++ b/tests/postgres_tests/test_array.py @@ -309,6 +309,22 @@ class TestQuerying(PostgreSQLTestCase): self.objs[2:3] ) + def test_order_by_slice(self): + more_objs = ( + NullableIntegerArrayModel.objects.create(field=[1, 637]), + NullableIntegerArrayModel.objects.create(field=[2, 1]), + NullableIntegerArrayModel.objects.create(field=[3, -98123]), + NullableIntegerArrayModel.objects.create(field=[4, 2]), + ) + self.assertSequenceEqual( + NullableIntegerArrayModel.objects.order_by('field__1'), + [ + more_objs[2], more_objs[1], more_objs[3], self.objs[2], + self.objs[3], more_objs[0], self.objs[4], self.objs[1], + self.objs[0], + ] + ) + @unittest.expectedFailure def test_slice_nested(self): instance = NestedIntegerArrayModel.objects.create(field=[[1, 2], [3, 4]]) diff --git a/tests/postgres_tests/test_hstore.py b/tests/postgres_tests/test_hstore.py index 069e570f51..b58e5e5e20 100644 --- a/tests/postgres_tests/test_hstore.py +++ b/tests/postgres_tests/test_hstore.py @@ -148,6 +148,18 @@ class TestQuerying(HStoreTestCase): self.objs[:2] ) + def test_order_by_field(self): + more_objs = ( + HStoreModel.objects.create(field={'g': '637'}), + HStoreModel.objects.create(field={'g': '002'}), + HStoreModel.objects.create(field={'g': '042'}), + HStoreModel.objects.create(field={'g': '981'}), + ) + self.assertSequenceEqual( + HStoreModel.objects.filter(field__has_key='g').order_by('field__g'), + [more_objs[1], more_objs[2], more_objs[0], more_objs[3]] + ) + def test_keys_contains(self): self.assertSequenceEqual( HStoreModel.objects.filter(field__keys__contains=['a']), diff --git a/tests/postgres_tests/test_json.py b/tests/postgres_tests/test_json.py index a572e670ac..b22cbfc571 100644 --- a/tests/postgres_tests/test_json.py +++ b/tests/postgres_tests/test_json.py @@ -141,6 +141,31 @@ class TestQuerying(PostgreSQLTestCase): [self.objs[0]] ) + def test_ordering_by_transform(self): + objs = [ + JSONModel.objects.create(field={'ord': 93, 'name': 'bar'}), + JSONModel.objects.create(field={'ord': 22.1, 'name': 'foo'}), + JSONModel.objects.create(field={'ord': -1, 'name': 'baz'}), + JSONModel.objects.create(field={'ord': 21.931902, 'name': 'spam'}), + JSONModel.objects.create(field={'ord': -100291029, 'name': 'eggs'}), + ] + query = JSONModel.objects.filter(field__name__isnull=False).order_by('field__ord') + self.assertSequenceEqual(query, [objs[4], objs[2], objs[3], objs[1], objs[0]]) + + def test_deep_values(self): + query = JSONModel.objects.values_list('field__k__l') + self.assertSequenceEqual( + query, + [ + (None,), (None,), (None,), (None,), (None,), (None,), + (None,), (None,), ('m',), (None,), (None,), (None,), + ] + ) + + def test_deep_distinct(self): + query = JSONModel.objects.distinct('field__k__l').values_list('field__k__l') + self.assertSequenceEqual(query, [('m',), (None,)]) + def test_isnull_key(self): # key__isnull works the same as has_key='key'. self.assertSequenceEqual( -- cgit v1.3