diff options
| author | Paveł Tyślacki <pavel.tyslacki@gmail.com> | 2019-02-11 17:24:10 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-03-17 20:50:57 -0400 |
| commit | 5c17c273ae2d7274f1fa78218b3b74690efddb86 (patch) | |
| tree | a85520c90bdcc4dc10fecad56c57b08f0d8b0c4e /django | |
| parent | 4bb859e24694f6cb8974ed9d2225f18214338ea3 (diff) | |
Refs #30172 -- Prevented removing a model Meta's index/unique_together from removing Meta constraints/indexes.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/backends/base/schema.py | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 35ab9bf219..1280666924 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -384,8 +384,13 @@ class BaseDatabaseSchemaEditor: self.execute(self._create_index_sql(model, fields, suffix="_idx")) def _delete_composed_index(self, model, fields, constraint_kwargs, sql): + meta_constraint_names = {constraint.name for constraint in model._meta.constraints} + meta_index_names = {constraint.name for constraint in model._meta.indexes} columns = [model._meta.get_field(field).column for field in fields] - constraint_names = self._constraint_names(model, columns, **constraint_kwargs) + constraint_names = self._constraint_names( + model, columns, exclude=meta_constraint_names | meta_index_names, + **constraint_kwargs + ) if len(constraint_names) != 1: raise ValueError("Found wrong number (%s) of constraints for %s(%s)" % ( len(constraint_names), @@ -607,13 +612,15 @@ class BaseDatabaseSchemaEditor: meta_index_names = {index.name for index in model._meta.indexes} # Retrieve only BTREE indexes since this is what's created with # db_index=True. - index_names = self._constraint_names(model, [old_field.column], index=True, type_=Index.suffix) + index_names = self._constraint_names( + model, [old_field.column], index=True, type_=Index.suffix, + exclude=meta_index_names, + ) for index_name in index_names: - if index_name not in meta_index_names: - # The only way to check if an index was created with - # db_index=True or with Index(['field'], name='foo') - # is to look at its name (refs #28053). - self.execute(self._delete_index_sql(model, index_name)) + # The only way to check if an index was created with + # db_index=True or with Index(['field'], name='foo') + # is to look at its name (refs #28053). + self.execute(self._delete_index_sql(model, index_name)) # Change check constraints? if old_db_params['check'] != new_db_params['check'] and old_db_params['check']: meta_constraint_names = {constraint.name for constraint in model._meta.constraints} |
