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.
This commit is contained in:
Simon Charette 2017-04-06 20:28:21 -04:00
parent 67b2b1f116
commit a354c69055
3 changed files with 11 additions and 2 deletions

View File

@ -74,8 +74,6 @@ class DatabaseOperations(BaseDatabaseOperations):
'istartswith', 'endswith', 'iendswith', 'regex', 'iregex'): 'istartswith', 'endswith', 'iendswith', 'regex', 'iregex'):
if internal_type in ('IPAddressField', 'GenericIPAddressField'): if internal_type in ('IPAddressField', 'GenericIPAddressField'):
lookup = "HOST(%s)" lookup = "HOST(%s)"
elif internal_type in ('CharField', 'TextField'):
lookup = '%s'
else: else:
lookup = "%s::text" lookup = "%s::text"

View File

@ -12,3 +12,6 @@ Bugfixes
* Made migrations respect ``Index``s ``name`` argument. If you created a * Made migrations respect ``Index``s ``name`` argument. If you created a
named index with Django 1.11, ``makemigrations`` will create a migration to named index with Django 1.11, ``makemigrations`` will create a migration to
recreate the index with the correct name (:ticket:`28051`). recreate the index with the correct name (:ticket:`28051`).
* Fixed a crash when using a ``__icontains`` lookup on a ``ArrayField``
(:ticket:`28038`).

View File

@ -216,6 +216,14 @@ class TestQuerying(PostgreSQLTestCase):
self.objs[1:3] 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): def test_contains_charfield(self):
# Regression for #22907 # Regression for #22907
self.assertSequenceEqual( self.assertSequenceEqual(