From b746596f5f0e1fcac791b0f7c8bfc3d69dfef2ff Mon Sep 17 00:00:00 2001 From: Hannes Ljungberg Date: Thu, 27 May 2021 21:35:24 +0200 Subject: [PATCH] Refs #32779 -- Changed DatabaseSchemaEditor._unique_sql()/_create_unique_sql() to take fields as second parameter. --- django/db/backends/base/schema.py | 19 ++++++++++--------- django/db/models/constraints.py | 4 ++-- docs/releases/4.0.txt | 3 +++ tests/schema/tests.py | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 5cecbb7d60..c409464eca 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -151,9 +151,9 @@ class BaseDatabaseSchemaEditor: """Take a model and return its table definition.""" # Add any unique_togethers (always deferred, as some fields might be # created afterwards, like geometry fields with some backends). - for fields in model._meta.unique_together: - columns = [model._meta.get_field(field).column for field in fields] - self.deferred_sql.append(self._create_unique_sql(model, columns)) + for field_names in model._meta.unique_together: + fields = [model._meta.get_field(field) for field in field_names] + self.deferred_sql.append(self._create_unique_sql(model, fields)) # Create column SQL, add FK deferreds if needed. column_sqls = [] params = [] @@ -407,9 +407,9 @@ class BaseDatabaseSchemaEditor: for fields in olds.difference(news): self._delete_composed_index(model, fields, {'unique': True}, self.sql_delete_unique) # Created uniques - for fields in news.difference(olds): - columns = [model._meta.get_field(field).column for field in fields] - self.execute(self._create_unique_sql(model, columns)) + for field_names in news.difference(olds): + fields = [model._meta.get_field(field) for field in field_names] + self.execute(self._create_unique_sql(model, fields)) def alter_index_together(self, model, old_index_together, new_index_together): """ @@ -790,7 +790,7 @@ class BaseDatabaseSchemaEditor: self._delete_primary_key(model, strict) # Added a unique? if self._unique_should_be_added(old_field, new_field): - self.execute(self._create_unique_sql(model, [new_field.column])) + self.execute(self._create_unique_sql(model, [new_field])) # Added an index? Add an index if db_index switched to True or a unique # constraint will no longer be used in lieu of an index. The following # lines from the truth table show all True cases; the rest are False: @@ -1214,7 +1214,7 @@ class BaseDatabaseSchemaEditor: self.deferred_sql.append(sql) return None constraint = self.sql_unique_constraint % { - 'columns': ', '.join(map(self.quote_name, fields)), + 'columns': ', '.join([self.quote_name(field.column) for field in fields]), 'deferrable': self._deferrable_constraint_sql(deferrable), } return self.sql_constraint % { @@ -1223,7 +1223,7 @@ class BaseDatabaseSchemaEditor: } def _create_unique_sql( - self, model, columns, name=None, condition=None, deferrable=None, + self, model, fields, name=None, condition=None, deferrable=None, include=None, opclasses=None, expressions=None, ): if ( @@ -1242,6 +1242,7 @@ class BaseDatabaseSchemaEditor: compiler = Query(model, alias_cols=False).get_compiler(connection=self.connection) table = model._meta.db_table + columns = [field.column for field in fields] if name is None: name = IndexName(table, columns, '_uniq', create_unique_name) else: diff --git a/django/db/models/constraints.py b/django/db/models/constraints.py index 6dfc42942f..8ae05a504c 100644 --- a/django/db/models/constraints.py +++ b/django/db/models/constraints.py @@ -187,7 +187,7 @@ class UniqueConstraint(BaseConstraint): ) def constraint_sql(self, model, schema_editor): - fields = [model._meta.get_field(field_name).column for field_name in self.fields] + fields = [model._meta.get_field(field_name) for field_name in self.fields] include = [model._meta.get_field(field_name).column for field_name in self.include] condition = self._get_condition_sql(model, schema_editor) expressions = self._get_index_expressions(model, schema_editor) @@ -198,7 +198,7 @@ class UniqueConstraint(BaseConstraint): ) def create_sql(self, model, schema_editor): - fields = [model._meta.get_field(field_name).column for field_name in self.fields] + fields = [model._meta.get_field(field_name) for field_name in self.fields] include = [model._meta.get_field(field_name).column for field_name in self.include] condition = self._get_condition_sql(model, schema_editor) expressions = self._get_index_expressions(model, schema_editor) diff --git a/docs/releases/4.0.txt b/docs/releases/4.0.txt index aa82afa4a5..831bb9b854 100644 --- a/docs/releases/4.0.txt +++ b/docs/releases/4.0.txt @@ -321,6 +321,9 @@ backends. ``iso_year`` argument in order to support bounds for ISO-8601 week-numbering years. +* The second argument of ``DatabaseSchemaEditor._unique_sql()`` and + ``_create_unique_sql()`` methods is now fields instead of columns. + :mod:`django.contrib.gis` ------------------------- diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 036ac29dce..eb9be178db 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -3287,7 +3287,7 @@ class SchemaTests(TransactionTestCase): constraint_name = 'CamelCaseUniqConstraint' expected_constraint_name = identifier_converter(constraint_name) - editor.execute(editor._create_unique_sql(model, [field.column], constraint_name)) + editor.execute(editor._create_unique_sql(model, [field], constraint_name)) self.assertIn(expected_constraint_name, self.get_constraints(model._meta.db_table)) editor.alter_field(model, get_field(unique=True), field, strict=True) self.assertNotIn(expected_constraint_name, self.get_constraints(model._meta.db_table))