summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2015-12-19 08:53:53 -0500
committerTim Graham <timograham@gmail.com>2015-12-19 13:50:06 -0500
commita80fb8ae24e77abf20047b9dfe867b4b53a8d648 (patch)
tree236717214fbd2b6858499004da6ef5049107377d /django
parent571f7b759ef90669d756774dd328cdc60f0fa8fe (diff)
[1.9.x] Fixed #25922 -- Fixed migrate --fake-initial detection of many-to-many tables.
Backport of fa9ce4e9a691e4f8c8b093784bac752e488dc60b from master
Diffstat (limited to 'django')
-rw-r--r--django/db/migrations/executor.py21
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,