From a354c69055fd818e612ce22eaa2da0576a4b89ee Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Thu, 6 Apr 2017 20:28:21 -0400 Subject: [PATCH] Fixed #28038 -- Restored casting to text of builtin lookups on PostgreSQL. Reverted 658f1e8 which broke code using __icontains's implicit cast to ::text on ArrayField. Thanks Peter J. Farrell for the report. --- django/db/backends/postgresql/operations.py | 2 -- docs/releases/1.11.1.txt | 3 +++ tests/postgres_tests/test_array.py | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py index 4658eac7c1..497a5303a2 100644 --- a/django/db/backends/postgresql/operations.py +++ b/django/db/backends/postgresql/operations.py @@ -74,8 +74,6 @@ class DatabaseOperations(BaseDatabaseOperations): 'istartswith', 'endswith', 'iendswith', 'regex', 'iregex'): if internal_type in ('IPAddressField', 'GenericIPAddressField'): lookup = "HOST(%s)" - elif internal_type in ('CharField', 'TextField'): - lookup = '%s' else: lookup = "%s::text" diff --git a/docs/releases/1.11.1.txt b/docs/releases/1.11.1.txt index 101988819a..d1e054bb18 100644 --- a/docs/releases/1.11.1.txt +++ b/docs/releases/1.11.1.txt @@ -12,3 +12,6 @@ Bugfixes * Made migrations respect ``Index``’s ``name`` argument. If you created a named index with Django 1.11, ``makemigrations`` will create a migration to recreate the index with the correct name (:ticket:`28051`). + +* Fixed a crash when using a ``__icontains`` lookup on a ``ArrayField`` + (:ticket:`28038`). diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py index 69ae5f3cda..a11b60e261 100644 --- a/tests/postgres_tests/test_array.py +++ b/tests/postgres_tests/test_array.py @@ -216,6 +216,14 @@ class TestQuerying(PostgreSQLTestCase): self.objs[1:3] ) + def test_icontains(self): + # Using the __icontains lookup with ArrayField is inefficient. + instance = CharArrayModel.objects.create(field=['FoO']) + self.assertSequenceEqual( + CharArrayModel.objects.filter(field__icontains='foo'), + [instance] + ) + def test_contains_charfield(self): # Regression for #22907 self.assertSequenceEqual(