Refs #27064 -- Refactored out MigrationAutodetector.create_renamed_fields().
This commit is contained in:
parent
c6cec3c2d2
commit
a098cde968
|
@ -122,6 +122,7 @@ class MigrationAutodetector:
|
||||||
self.generated_operations = {}
|
self.generated_operations = {}
|
||||||
self.altered_indexes = {}
|
self.altered_indexes = {}
|
||||||
self.altered_constraints = {}
|
self.altered_constraints = {}
|
||||||
|
self.renamed_fields = {}
|
||||||
|
|
||||||
# Prepare some old/new state and model lists, separating
|
# Prepare some old/new state and model lists, separating
|
||||||
# proxy models and ignoring unmigrated apps.
|
# proxy models and ignoring unmigrated apps.
|
||||||
|
@ -169,6 +170,11 @@ class MigrationAutodetector:
|
||||||
self.generate_altered_options()
|
self.generate_altered_options()
|
||||||
self.generate_altered_managers()
|
self.generate_altered_managers()
|
||||||
|
|
||||||
|
# Create the renamed fields and store them in self.renamed_fields.
|
||||||
|
# They are used by create_altered_indexes(), generate_altered_fields(),
|
||||||
|
# generate_removed_altered_index/unique_together(), and
|
||||||
|
# generate_altered_index/unique_together().
|
||||||
|
self.create_renamed_fields()
|
||||||
# Create the altered indexes and store them in self.altered_indexes.
|
# Create the altered indexes and store them in self.altered_indexes.
|
||||||
# This avoids the same computation in generate_removed_indexes()
|
# This avoids the same computation in generate_removed_indexes()
|
||||||
# and generate_added_indexes().
|
# and generate_added_indexes().
|
||||||
|
@ -907,11 +913,12 @@ class MigrationAutodetector:
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
def generate_renamed_fields(self):
|
def create_renamed_fields(self):
|
||||||
"""Work out renamed fields."""
|
"""Work out renamed fields."""
|
||||||
self.renamed_fields = {}
|
self.renamed_operations = []
|
||||||
|
old_field_keys = self.old_field_keys.copy()
|
||||||
for app_label, model_name, field_name in sorted(
|
for app_label, model_name, field_name in sorted(
|
||||||
self.new_field_keys - self.old_field_keys
|
self.new_field_keys - old_field_keys
|
||||||
):
|
):
|
||||||
old_model_name = self.renamed_models.get(
|
old_model_name = self.renamed_models.get(
|
||||||
(app_label, model_name), model_name
|
(app_label, model_name), model_name
|
||||||
|
@ -922,7 +929,7 @@ class MigrationAutodetector:
|
||||||
# Scan to see if this is actually a rename!
|
# Scan to see if this is actually a rename!
|
||||||
field_dec = self.deep_deconstruct(field)
|
field_dec = self.deep_deconstruct(field)
|
||||||
for rem_app_label, rem_model_name, rem_field_name in sorted(
|
for rem_app_label, rem_model_name, rem_field_name in sorted(
|
||||||
self.old_field_keys - self.new_field_keys
|
old_field_keys - self.new_field_keys
|
||||||
):
|
):
|
||||||
if rem_app_label == app_label and rem_model_name == model_name:
|
if rem_app_label == app_label and rem_model_name == model_name:
|
||||||
old_field = old_model_state.get_field(rem_field_name)
|
old_field = old_model_state.get_field(rem_field_name)
|
||||||
|
@ -947,37 +954,64 @@ class MigrationAutodetector:
|
||||||
if self.questioner.ask_rename(
|
if self.questioner.ask_rename(
|
||||||
model_name, rem_field_name, field_name, field
|
model_name, rem_field_name, field_name, field
|
||||||
):
|
):
|
||||||
# A db_column mismatch requires a prior noop
|
self.renamed_operations.append(
|
||||||
# AlterField for the subsequent RenameField to be a
|
(
|
||||||
# noop on attempts at preserving the old name.
|
rem_app_label,
|
||||||
if old_field.db_column != field.db_column:
|
rem_model_name,
|
||||||
altered_field = field.clone()
|
old_field.db_column,
|
||||||
altered_field.name = rem_field_name
|
rem_field_name,
|
||||||
self.add_operation(
|
|
||||||
app_label,
|
app_label,
|
||||||
operations.AlterField(
|
model_name,
|
||||||
model_name=model_name,
|
field,
|
||||||
name=rem_field_name,
|
field_name,
|
||||||
field=altered_field,
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
self.add_operation(
|
|
||||||
app_label,
|
|
||||||
operations.RenameField(
|
|
||||||
model_name=model_name,
|
|
||||||
old_name=rem_field_name,
|
|
||||||
new_name=field_name,
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
self.old_field_keys.remove(
|
old_field_keys.remove(
|
||||||
(rem_app_label, rem_model_name, rem_field_name)
|
(rem_app_label, rem_model_name, rem_field_name)
|
||||||
)
|
)
|
||||||
self.old_field_keys.add((app_label, model_name, field_name))
|
old_field_keys.add((app_label, model_name, field_name))
|
||||||
self.renamed_fields[
|
self.renamed_fields[
|
||||||
app_label, model_name, field_name
|
app_label, model_name, field_name
|
||||||
] = rem_field_name
|
] = rem_field_name
|
||||||
break
|
break
|
||||||
|
|
||||||
|
def generate_renamed_fields(self):
|
||||||
|
"""Generate RenameField operations."""
|
||||||
|
for (
|
||||||
|
rem_app_label,
|
||||||
|
rem_model_name,
|
||||||
|
rem_db_column,
|
||||||
|
rem_field_name,
|
||||||
|
app_label,
|
||||||
|
model_name,
|
||||||
|
field,
|
||||||
|
field_name,
|
||||||
|
) in self.renamed_operations:
|
||||||
|
# A db_column mismatch requires a prior noop AlterField for the
|
||||||
|
# subsequent RenameField to be a noop on attempts at preserving the
|
||||||
|
# old name.
|
||||||
|
if rem_db_column != field.db_column:
|
||||||
|
altered_field = field.clone()
|
||||||
|
altered_field.name = rem_field_name
|
||||||
|
self.add_operation(
|
||||||
|
app_label,
|
||||||
|
operations.AlterField(
|
||||||
|
model_name=model_name,
|
||||||
|
name=rem_field_name,
|
||||||
|
field=altered_field,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
self.add_operation(
|
||||||
|
app_label,
|
||||||
|
operations.RenameField(
|
||||||
|
model_name=model_name,
|
||||||
|
old_name=rem_field_name,
|
||||||
|
new_name=field_name,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
self.old_field_keys.remove((rem_app_label, rem_model_name, rem_field_name))
|
||||||
|
self.old_field_keys.add((app_label, model_name, field_name))
|
||||||
|
|
||||||
def generate_added_fields(self):
|
def generate_added_fields(self):
|
||||||
"""Make AddField operations."""
|
"""Make AddField operations."""
|
||||||
for app_label, model_name, field_name in sorted(
|
for app_label, model_name, field_name in sorted(
|
||||||
|
|
Loading…
Reference in New Issue