diff options
| author | Andrew Godwin <andrew@aeracode.org> | 2014-07-29 09:38:08 -0700 |
|---|---|---|
| committer | Andrew Godwin <andrew@aeracode.org> | 2014-07-29 09:39:01 -0700 |
| commit | 0a4fbf4e13b194383f9eecc0af337a50fb6dfe98 (patch) | |
| tree | a76bcbc998050935b936a1fc9b0452751f30ff97 /django | |
| parent | fb8ddac27afa2720226051cb0daff47bd0377a49 (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.py | 26 |
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: |
