diff options
| author | Paveł Tyślacki <pavel.tyslacki@gmail.com> | 2019-02-11 17:17:06 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-03-17 21:28:36 -0400 |
| commit | 3dd5e71752c993df00e01fca8086a1af5ba89176 (patch) | |
| tree | 8ab21f4a16e27d320e63713ba033bbb4d3f916f5 /django/db | |
| parent | 40b0a58f5ff949fba1072627e4ad11ef98aa7f36 (diff) | |
[2.2.x] Refs #30172 -- Prevented removing a field's check or unique constraint from removing Meta constraints.
Backport of 4bb859e24694f6cb8974ed9d2225f18214338ea3 from master.
Diffstat (limited to 'django/db')
| -rw-r--r-- | django/db/backends/base/features.py | 4 | ||||
| -rw-r--r-- | django/db/backends/base/schema.py | 17 | ||||
| -rw-r--r-- | django/db/backends/oracle/features.py | 1 |
3 files changed, 18 insertions, 4 deletions
diff --git a/django/db/backends/base/features.py b/django/db/backends/base/features.py index 8afc7eb516..99ab45f21c 100644 --- a/django/db/backends/base/features.py +++ b/django/db/backends/base/features.py @@ -281,6 +281,10 @@ class BaseDatabaseFeatures: supports_partial_indexes = True supports_functions_in_partial_indexes = True + # Does the database allow more than one constraint or index on the same + # field(s)? + allows_multiple_constraints_on_same_fields = True + def __init__(self, connection): self.connection = connection diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 113d1b7f67..19c9a04ba8 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -548,7 +548,11 @@ class BaseDatabaseSchemaEditor: # Has unique been removed? if old_field.unique and (not new_field.unique or self._field_became_primary_key(old_field, new_field)): # Find the unique constraint for this field - constraint_names = self._constraint_names(model, [old_field.column], unique=True, primary_key=False) + meta_constraint_names = {constraint.name for constraint in model._meta.constraints} + constraint_names = self._constraint_names( + model, [old_field.column], unique=True, primary_key=False, + exclude=meta_constraint_names, + ) if strict and len(constraint_names) != 1: raise ValueError("Found wrong number (%s) of unique constraints for %s.%s" % ( len(constraint_names), @@ -598,7 +602,11 @@ class BaseDatabaseSchemaEditor: 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']: - constraint_names = self._constraint_names(model, [old_field.column], check=True) + meta_constraint_names = {constraint.name for constraint in model._meta.constraints} + constraint_names = self._constraint_names( + model, [old_field.column], check=True, + exclude=meta_constraint_names, + ) if strict and len(constraint_names) != 1: raise ValueError("Found wrong number (%s) of check constraints for %s.%s" % ( len(constraint_names), @@ -1089,7 +1097,7 @@ class BaseDatabaseSchemaEditor: def _constraint_names(self, model, column_names=None, unique=None, primary_key=None, index=None, foreign_key=None, - check=None, type_=None): + check=None, type_=None, exclude=None): """Return all constraint names matching the columns and conditions.""" if column_names is not None: column_names = [ @@ -1113,7 +1121,8 @@ class BaseDatabaseSchemaEditor: continue if type_ is not None and infodict['type'] != type_: continue - result.append(name) + if not exclude or name not in exclude: + result.append(name) return result def _delete_primary_key(self, model, strict=False): diff --git a/django/db/backends/oracle/features.py b/django/db/backends/oracle/features.py index ec301d9d37..55bf327440 100644 --- a/django/db/backends/oracle/features.py +++ b/django/db/backends/oracle/features.py @@ -56,6 +56,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_ignore_conflicts = False max_query_params = 2**16 - 1 supports_partial_indexes = False + allows_multiple_constraints_on_same_fields = False @cached_property def has_fetch_offset_support(self): |
