Fixed #31825 -- Made RenameField operation a noop for fields with db_column.
This commit is contained in:
parent
20799cc0a6
commit
7f4c9222df
1
AUTHORS
1
AUTHORS
|
@ -386,6 +386,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Ilya Semenov <semenov@inetss.com>
|
Ilya Semenov <semenov@inetss.com>
|
||||||
Ingo Klöcker <djangoproject@ingo-kloecker.de>
|
Ingo Klöcker <djangoproject@ingo-kloecker.de>
|
||||||
I.S. van Oostveen <v.oostveen@idca.nl>
|
I.S. van Oostveen <v.oostveen@idca.nl>
|
||||||
|
Iuri de Silvio <https://github.com/iurisilvio>
|
||||||
ivan.chelubeev@gmail.com
|
ivan.chelubeev@gmail.com
|
||||||
Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
|
Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
|
||||||
Jaap Roes <jaap.roes@gmail.com>
|
Jaap Roes <jaap.roes@gmail.com>
|
||||||
|
|
|
@ -538,6 +538,8 @@ class BaseDatabaseSchemaEditor:
|
||||||
If `strict` is True, raise errors if the old column does not match
|
If `strict` is True, raise errors if the old column does not match
|
||||||
`old_field` precisely.
|
`old_field` precisely.
|
||||||
"""
|
"""
|
||||||
|
if not self._field_should_be_altered(old_field, new_field):
|
||||||
|
return
|
||||||
# Ensure this field is even column-based
|
# Ensure this field is even column-based
|
||||||
old_db_params = old_field.db_parameters(connection=self.connection)
|
old_db_params = old_field.db_parameters(connection=self.connection)
|
||||||
old_type = old_db_params['type']
|
old_type = old_db_params['type']
|
||||||
|
@ -1034,6 +1036,13 @@ class BaseDatabaseSchemaEditor:
|
||||||
output.append(self._create_index_sql(model, [field]))
|
output.append(self._create_index_sql(model, [field]))
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
def _field_should_be_altered(self, old_field, new_field):
|
||||||
|
# Don't alter when changing only a field name.
|
||||||
|
return (
|
||||||
|
old_field.column != new_field.column or
|
||||||
|
old_field.deconstruct()[1:] != new_field.deconstruct()[1:]
|
||||||
|
)
|
||||||
|
|
||||||
def _field_should_be_indexed(self, model, field):
|
def _field_should_be_indexed(self, model, field):
|
||||||
return field.db_index and not field.unique
|
return field.db_index and not field.unique
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
||||||
super().alter_db_table(model, old_db_table, new_db_table)
|
super().alter_db_table(model, old_db_table, new_db_table)
|
||||||
|
|
||||||
def alter_field(self, model, old_field, new_field, strict=False):
|
def alter_field(self, model, old_field, new_field, strict=False):
|
||||||
|
if not self._field_should_be_altered(old_field, new_field):
|
||||||
|
return
|
||||||
old_field_name = old_field.name
|
old_field_name = old_field.name
|
||||||
table_name = model._meta.db_table
|
table_name = model._meta.db_table
|
||||||
_, old_column_name = old_field.get_attname_column()
|
_, old_column_name = old_field.get_attname_column()
|
||||||
|
|
|
@ -1632,6 +1632,48 @@ class OperationTests(OperationTestBase):
|
||||||
self.assertEqual(definition[1], [])
|
self.assertEqual(definition[1], [])
|
||||||
self.assertEqual(definition[2], {'model_name': "Pony", 'old_name': "pink", 'new_name': "blue"})
|
self.assertEqual(definition[2], {'model_name': "Pony", 'old_name': "pink", 'new_name': "blue"})
|
||||||
|
|
||||||
|
def test_rename_field_with_db_column(self):
|
||||||
|
project_state = self.apply_operations('test_rfwdbc', ProjectState(), operations=[
|
||||||
|
migrations.CreateModel('Pony', fields=[
|
||||||
|
('id', models.AutoField(primary_key=True)),
|
||||||
|
('field', models.IntegerField(db_column='db_field')),
|
||||||
|
('fk_field', models.ForeignKey(
|
||||||
|
'Pony',
|
||||||
|
models.CASCADE,
|
||||||
|
db_column='db_fk_field',
|
||||||
|
)),
|
||||||
|
]),
|
||||||
|
])
|
||||||
|
new_state = project_state.clone()
|
||||||
|
operation = migrations.RenameField('Pony', 'field', 'renamed_field')
|
||||||
|
operation.state_forwards('test_rfwdbc', new_state)
|
||||||
|
self.assertIn('renamed_field', new_state.models['test_rfwdbc', 'pony'].fields)
|
||||||
|
self.assertNotIn('field', new_state.models['test_rfwdbc', 'pony'].fields)
|
||||||
|
self.assertColumnExists('test_rfwdbc_pony', 'db_field')
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
with self.assertNumQueries(0):
|
||||||
|
operation.database_forwards('test_rfwdbc', editor, project_state, new_state)
|
||||||
|
self.assertColumnExists('test_rfwdbc_pony', 'db_field')
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
with self.assertNumQueries(0):
|
||||||
|
operation.database_backwards('test_rfwdbc', editor, new_state, project_state)
|
||||||
|
self.assertColumnExists('test_rfwdbc_pony', 'db_field')
|
||||||
|
|
||||||
|
new_state = project_state.clone()
|
||||||
|
operation = migrations.RenameField('Pony', 'fk_field', 'renamed_fk_field')
|
||||||
|
operation.state_forwards('test_rfwdbc', new_state)
|
||||||
|
self.assertIn('renamed_fk_field', new_state.models['test_rfwdbc', 'pony'].fields)
|
||||||
|
self.assertNotIn('fk_field', new_state.models['test_rfwdbc', 'pony'].fields)
|
||||||
|
self.assertColumnExists('test_rfwdbc_pony', 'db_fk_field')
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
with self.assertNumQueries(0):
|
||||||
|
operation.database_forwards('test_rfwdbc', editor, project_state, new_state)
|
||||||
|
self.assertColumnExists('test_rfwdbc_pony', 'db_fk_field')
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
with self.assertNumQueries(0):
|
||||||
|
operation.database_backwards('test_rfwdbc', editor, new_state, project_state)
|
||||||
|
self.assertColumnExists('test_rfwdbc_pony', 'db_fk_field')
|
||||||
|
|
||||||
def test_rename_missing_field(self):
|
def test_rename_missing_field(self):
|
||||||
state = ProjectState()
|
state = ProjectState()
|
||||||
state.add_model(ModelState('app', 'model', []))
|
state.add_model(ModelState('app', 'model', []))
|
||||||
|
|
Loading…
Reference in New Issue