summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorPaveł Tyślacki <pavel.tyslacki@gmail.com>2019-02-11 17:24:10 +0300
committerTim Graham <timograham@gmail.com>2019-03-17 20:50:57 -0400
commit5c17c273ae2d7274f1fa78218b3b74690efddb86 (patch)
treea85520c90bdcc4dc10fecad56c57b08f0d8b0c4e /django
parent4bb859e24694f6cb8974ed9d2225f18214338ea3 (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.py21
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}