Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #21968: Bad detection of old-style apps to add initial migration

  • Loading branch information...
commit 2085f53f567f7619ecf3eab93fdacab7a5991a11 1 parent 75a96f0
@andrewgodwin andrewgodwin authored
View
2  django/core/management/commands/makemigrations.py
@@ -47,7 +47,9 @@ def handle(self, *app_labels, **options):
# Load the current graph state. Takes a connection, but it's not used
# (makemigrations doesn't look at the database state).
+ # Also make sure the graph is built without unmigrated apps shoehorned in.
loader = MigrationLoader(connections[DEFAULT_DB_ALIAS])
+ loader.build_graph(ignore_unmigrated=True)
# Before anything else, see if there's conflicting apps and drop out
# hard if there are any and they don't want to merge
View
51 django/db/migrations/loader.py
@@ -135,7 +135,7 @@ def get_migration_by_prefix(self, app_label, name_prefix):
else:
return self.disk_migrations[results[0]]
- def build_graph(self):
+ def build_graph(self, ignore_unmigrated=False):
"""
Builds a migration dependency graph using both the disk and database.
You'll need to rebuild the graph if you apply migrations. This isn't
@@ -200,33 +200,38 @@ def build_graph(self):
# even have migrations.
if parent[1] == "__first__" and parent not in self.graph:
if parent[0] in self.unmigrated_apps:
- # This app isn't migrated, but something depends on it.
- # We'll add a fake initial migration for it into the
- # graph.
- app_config = apps.get_app_config(parent[0])
- ops = []
- for model in app_config.get_models():
- model_state = ModelState.from_model(model)
- ops.append(
- operations.CreateModel(
- name=model_state.name,
- fields=model_state.fields,
- options=model_state.options,
- bases=model_state.bases,
+ if ignore_unmigrated:
+ migration.dependencies.remove(parent)
+ parent = None
+ else:
+ # This app isn't migrated, but something depends on it.
+ # We'll add a fake initial migration for it into the
+ # graph.
+ app_config = apps.get_app_config(parent[0])
+ ops = []
+ for model in app_config.get_models():
+ model_state = ModelState.from_model(model)
+ ops.append(
+ operations.CreateModel(
+ name=model_state.name,
+ fields=model_state.fields,
+ options=model_state.options,
+ bases=model_state.bases,
+ )
)
- )
- new_migration = type(
- "FakeInitialMigration",
- (Migration, ),
- {"operations": ops},
- )(parent[1], parent[0])
- self.graph.add_node(parent, new_migration)
- self.applied_migrations.add(parent)
+ new_migration = type(
+ "FakeInitialMigration",
+ (Migration, ),
+ {"operations": ops},
+ )(parent[1], parent[0])
+ self.graph.add_node(parent, new_migration)
+ self.applied_migrations.add(parent)
elif parent[0] in self.migrated_apps:
parent = list(self.graph.root_nodes(parent[0]))[0]
else:
raise ValueError("Dependency on unknown app %s" % parent[0])
- self.graph.add_dependency(key, parent)
+ if parent is not None:
+ self.graph.add_dependency(key, parent)
def detect_conflicts(self):
"""
Please sign in to comment.
Something went wrong with that request. Please try again.