From 4d3b8e199ec00a0aba111637a25f5abcaf3d6dfc Mon Sep 17 00:00:00 2001 From: Mads Jensen Date: Tue, 14 Nov 2017 22:51:51 +0100 Subject: [2.0.x] Fixed #28702 -- Made query lookups for CIText fields use citext. Backport of f0a68c25118786d47041d0a435b2afa953be3c86 from master --- django/contrib/postgres/fields/citext.py | 4 ++++ django/db/backends/postgresql/operations.py | 2 ++ django/db/backends/postgresql/schema.py | 7 ++++--- 3 files changed, 10 insertions(+), 3 deletions(-) (limited to 'django') diff --git a/django/contrib/postgres/fields/citext.py b/django/contrib/postgres/fields/citext.py index 42660001ae..46f6d3d1c2 100644 --- a/django/contrib/postgres/fields/citext.py +++ b/django/contrib/postgres/fields/citext.py @@ -4,6 +4,10 @@ __all__ = ['CICharField', 'CIEmailField', 'CIText', 'CITextField'] class CIText: + + def get_internal_type(self): + return 'CI' + super().get_internal_type() + def db_type(self, connection): return 'citext' diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py index 268fa99b51..c4a61f7070 100644 --- a/django/db/backends/postgresql/operations.py +++ b/django/db/backends/postgresql/operations.py @@ -77,6 +77,8 @@ class DatabaseOperations(BaseDatabaseOperations): 'istartswith', 'endswith', 'iendswith', 'regex', 'iregex'): if internal_type in ('IPAddressField', 'GenericIPAddressField'): lookup = "HOST(%s)" + elif internal_type in ('CICharField', 'CIEmailField', 'CITextField'): + lookup = '%s::citext' else: lookup = "%s::text" diff --git a/django/db/backends/postgresql/schema.py b/django/db/backends/postgresql/schema.py index 20cea3f249..18388cc523 100644 --- a/django/db/backends/postgresql/schema.py +++ b/django/db/backends/postgresql/schema.py @@ -107,11 +107,12 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): def _alter_field(self, model, old_field, new_field, old_type, new_type, old_db_params, new_db_params, strict=False): - # Drop indexes on varchar/text columns that are changing to a different - # type. + # Drop indexes on varchar/text/citext columns that are changing to a + # different type. if (old_field.db_index or old_field.unique) and ( (old_type.startswith('varchar') and not new_type.startswith('varchar')) or - (old_type.startswith('text') and not new_type.startswith('text')) + (old_type.startswith('text') and not new_type.startswith('text')) or + (old_type.startswith('citext') and not new_type.startswith('citext')) ): index_name = self._create_index_name(model._meta.db_table, [old_field.column], suffix='_like') self.execute(self._delete_constraint_sql(self.sql_delete_index, model, index_name)) -- cgit v1.3