mirror of
https://github.com/django/django.git
synced 2025-10-25 14:46:09 +00:00
Fixed #23745 -- Reused states as much as possible in migrations
Thanks Tim Graham and Markus Holtermann for the reviews.
This commit is contained in:
@@ -38,6 +38,7 @@ class AddField(Operation):
|
||||
else:
|
||||
field = self.field
|
||||
state.models[app_label, self.model_name.lower()].fields.append((self.name, field))
|
||||
state.reload_model(app_label, self.model_name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
to_model = to_state.apps.get_model(app_label, self.model_name)
|
||||
@@ -94,6 +95,7 @@ class RemoveField(Operation):
|
||||
if name != self.name:
|
||||
new_fields.append((name, instance))
|
||||
state.models[app_label, self.model_name.lower()].fields = new_fields
|
||||
state.reload_model(app_label, self.model_name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
from_model = from_state.apps.get_model(app_label, self.model_name)
|
||||
@@ -150,6 +152,7 @@ class AlterField(Operation):
|
||||
state.models[app_label, self.model_name.lower()].fields = [
|
||||
(n, field if n == self.name else f) for n, f in state.models[app_label, self.model_name.lower()].fields
|
||||
]
|
||||
state.reload_model(app_label, self.model_name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
to_model = to_state.apps.get_model(app_label, self.model_name)
|
||||
@@ -220,6 +223,7 @@ class RenameField(Operation):
|
||||
[self.new_name if n == self.old_name else n for n in together]
|
||||
for together in options[option]
|
||||
]
|
||||
state.reload_model(app_label, self.model_name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
to_model = to_state.apps.get_model(app_label, self.model_name)
|
||||
|
||||
@@ -39,14 +39,14 @@ class CreateModel(Operation):
|
||||
)
|
||||
|
||||
def state_forwards(self, app_label, state):
|
||||
state.models[app_label, self.name.lower()] = ModelState(
|
||||
state.add_model(ModelState(
|
||||
app_label,
|
||||
self.name,
|
||||
list(self.fields),
|
||||
dict(self.options),
|
||||
tuple(self.bases),
|
||||
list(self.managers),
|
||||
)
|
||||
))
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
model = to_state.apps.get_model(app_label, self.name)
|
||||
@@ -98,7 +98,7 @@ class DeleteModel(Operation):
|
||||
)
|
||||
|
||||
def state_forwards(self, app_label, state):
|
||||
del state.models[app_label, self.name.lower()]
|
||||
state.remove_model(app_label, self.name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
model = from_state.apps.get_model(app_label, self.name)
|
||||
@@ -141,12 +141,13 @@ class RenameModel(Operation):
|
||||
# Get all of the related objects we need to repoint
|
||||
apps = state.apps
|
||||
model = apps.get_model(app_label, self.old_name)
|
||||
model._meta.apps = apps
|
||||
related_objects = model._meta.get_all_related_objects()
|
||||
related_m2m_objects = model._meta.get_all_related_many_to_many_objects()
|
||||
# Rename the model
|
||||
state.models[app_label, self.new_name.lower()] = state.models[app_label, self.old_name.lower()]
|
||||
state.models[app_label, self.new_name.lower()].name = self.new_name
|
||||
del state.models[app_label, self.old_name.lower()]
|
||||
state.remove_model(app_label, self.old_name)
|
||||
# Repoint the FKs and M2Ms pointing to us
|
||||
for related_object in (related_objects + related_m2m_objects):
|
||||
# Use the new related key for self referential related objects.
|
||||
@@ -164,7 +165,8 @@ class RenameModel(Operation):
|
||||
field.rel.to = "%s.%s" % (app_label, self.new_name)
|
||||
new_fields.append((name, field))
|
||||
state.models[related_key].fields = new_fields
|
||||
del state.apps # FIXME: this should be replaced by a logic in state (update_model?)
|
||||
state.reload_model(*related_key)
|
||||
state.reload_model(app_label, self.new_name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
new_model = to_state.apps.get_model(app_label, self.new_name)
|
||||
@@ -235,6 +237,7 @@ class AlterModelTable(Operation):
|
||||
|
||||
def state_forwards(self, app_label, state):
|
||||
state.models[app_label, self.name.lower()].options["db_table"] = self.table
|
||||
state.reload_model(app_label, self.name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
new_model = to_state.apps.get_model(app_label, self.name)
|
||||
@@ -290,6 +293,7 @@ class AlterUniqueTogether(Operation):
|
||||
def state_forwards(self, app_label, state):
|
||||
model_state = state.models[app_label, self.name.lower()]
|
||||
model_state.options[self.option_name] = self.unique_together
|
||||
state.reload_model(app_label, self.name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
new_model = to_state.apps.get_model(app_label, self.name)
|
||||
@@ -337,6 +341,7 @@ class AlterIndexTogether(Operation):
|
||||
def state_forwards(self, app_label, state):
|
||||
model_state = state.models[app_label, self.name.lower()]
|
||||
model_state.options[self.option_name] = self.index_together
|
||||
state.reload_model(app_label, self.name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
new_model = to_state.apps.get_model(app_label, self.name)
|
||||
@@ -381,6 +386,7 @@ class AlterOrderWithRespectTo(Operation):
|
||||
def state_forwards(self, app_label, state):
|
||||
model_state = state.models[app_label, self.name.lower()]
|
||||
model_state.options['order_with_respect_to'] = self.order_with_respect_to
|
||||
state.reload_model(app_label, self.name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
to_model = to_state.apps.get_model(app_label, self.name)
|
||||
@@ -451,6 +457,7 @@ class AlterModelOptions(Operation):
|
||||
for key in self.ALTER_OPTION_KEYS:
|
||||
if key not in self.options and key in model_state.options:
|
||||
del model_state.options[key]
|
||||
state.reload_model(app_label, self.name)
|
||||
|
||||
def database_forwards(self, app_label, schema_editor, from_state, to_state):
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user