diff options
| author | Tim Graham <timograham@gmail.com> | 2015-12-19 08:53:53 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-12-19 13:37:24 -0500 |
| commit | fa9ce4e9a691e4f8c8b093784bac752e488dc60b (patch) | |
| tree | bf3fd60e63220cb1b229d04962677e885d5018f0 /django/db/migrations/executor.py | |
| parent | b26d147259202455ce356755b729c3dcb16ae9e6 (diff) | |
Fixed #25922 -- Fixed migrate --fake-initial detection of many-to-many tables.
Diffstat (limited to 'django/db/migrations/executor.py')
| -rw-r--r-- | django/db/migrations/executor.py | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/django/db/migrations/executor.py b/django/db/migrations/executor.py index 3779b626ec..b1a8383100 100644 --- a/django/db/migrations/executor.py +++ b/django/db/migrations/executor.py @@ -265,6 +265,7 @@ class MigrationExecutor(object): apps = after_state.apps found_create_model_migration = False found_add_field_migration = False + existing_table_names = self.connection.introspection.table_names(self.connection.cursor()) # Make sure all create model and add field operations are done for operation in migration.operations: if isinstance(operation, migrations.CreateModel): @@ -275,7 +276,7 @@ class MigrationExecutor(object): model = global_apps.get_model(model._meta.swapped) if model._meta.proxy or not model._meta.managed: continue - if model._meta.db_table not in self.connection.introspection.table_names(self.connection.cursor()): + if model._meta.db_table not in existing_table_names: return False, project_state found_create_model_migration = True elif isinstance(operation, migrations.AddField): @@ -288,9 +289,21 @@ class MigrationExecutor(object): continue table = model._meta.db_table - db_field = model._meta.get_field(operation.name).column - fields = self.connection.introspection.get_table_description(self.connection.cursor(), table) - if db_field not in (f.name for f in fields): + field = model._meta.get_field(operation.name) + + # Handle implicit many-to-many tables created by AddField. + if field.many_to_many: + if field.remote_field.through._meta.db_table not in existing_table_names: + return False, project_state + else: + found_add_field_migration = True + continue + + column_names = [ + column.name for column in + self.connection.introspection.get_table_description(self.connection.cursor(), table) + ] + if field.column not in column_names: return False, project_state found_add_field_migration = True # If we get this far and we found at least one CreateModel or AddField migration, |
