summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorAndrew Godwin <andrew@aeracode.org>2014-07-29 09:38:08 -0700
committerAndrew Godwin <andrew@aeracode.org>2014-07-29 09:39:01 -0700
commit0a4fbf4e13b194383f9eecc0af337a50fb6dfe98 (patch)
treea76bcbc998050935b936a1fc9b0452751f30ff97 /django
parentfb8ddac27afa2720226051cb0daff47bd0377a49 (diff)
[1.7.x] Fixed #23101: Prefer doing deletes before creates in autodetector.
Makes declined or missed renames still work (but drop data).
Diffstat (limited to 'django')
-rw-r--r--django/db/migrations/autodetector.py26
1 files changed, 16 insertions, 10 deletions
diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py
index e27d8ace74..dd9595bd7e 100644
--- a/django/db/migrations/autodetector.py
+++ b/django/db/migrations/autodetector.py
@@ -160,15 +160,16 @@ class MigrationAutodetector(object):
self.through_users[through_key] = (app_label, old_model_name, field_name)
# Generate non-rename model operations
- self.generate_created_models()
self.generate_deleted_models()
- self.generate_created_proxies()
+ self.generate_created_models()
self.generate_deleted_proxies()
+ self.generate_created_proxies()
self.generate_altered_options()
# Generate field operations
- self.generate_added_fields()
+ self.generate_renamed_fields()
self.generate_removed_fields()
+ self.generate_added_fields()
self.generate_altered_fields()
self.generate_altered_unique_together()
self.generate_altered_index_together()
@@ -682,17 +683,17 @@ class MigrationAutodetector(object):
),
)
- def generate_added_fields(self):
- # New fields
+ def generate_renamed_fields(self):
+ """
+ Works out renamed fields
+ """
self.renamed_fields = {}
for app_label, model_name, field_name in sorted(self.new_field_keys - self.old_field_keys):
old_model_name = self.renamed_models.get((app_label, model_name), model_name)
old_model_state = self.from_state.models[app_label, old_model_name]
- new_model_state = self.to_state.models[app_label, model_name]
field = self.new_apps.get_model(app_label, model_name)._meta.get_field_by_name(field_name)[0]
# Scan to see if this is actually a rename!
field_dec = self.deep_deconstruct(field)
- found_rename = False
for rem_app_label, rem_model_name, rem_field_name in sorted(self.old_field_keys - self.new_field_keys):
if rem_app_label == app_label and rem_model_name == model_name:
old_field_dec = self.deep_deconstruct(old_model_state.get_field_by_name(rem_field_name))
@@ -713,10 +714,15 @@ class MigrationAutodetector(object):
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))
self.renamed_fields[app_label, model_name, field_name] = rem_field_name
- found_rename = True
break
- if found_rename:
- continue
+
+
+ def generate_added_fields(self):
+ """
+ Fields that have been added
+ """
+ for app_label, model_name, field_name in sorted(self.new_field_keys - self.old_field_keys):
+ field = self.new_apps.get_model(app_label, model_name)._meta.get_field_by_name(field_name)[0]
# Fields that are foreignkeys/m2ms depend on stuff
dependencies = []
if field.rel and field.rel.to: