summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Walls <jacobtylerwalls@gmail.com>2025-03-30 08:18:18 -0400
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-04-01 09:35:37 +0200
commita0fb35eb726f1a04eaa1b47b8de191fafe55a0ab (patch)
tree8783e5f447feeb4b5201900b1628511ebcee0118
parent12385b4fa7059aab8e4f671853cc09ae8509501f (diff)
Fixed #36184 -- Allowed migrating forward to squashed migrations.
-rw-r--r--django/db/migrations/executor.py18
-rw-r--r--tests/migrations/test_commands.py10
2 files changed, 19 insertions, 9 deletions
diff --git a/django/db/migrations/executor.py b/django/db/migrations/executor.py
index ebfe8572fe..61b2b54f6c 100644
--- a/django/db/migrations/executor.py
+++ b/django/db/migrations/executor.py
@@ -37,18 +37,18 @@ class MigrationExecutor:
if migration in applied:
plan.append((self.loader.graph.nodes[migration], True))
applied.pop(migration)
+ # If the target is missing, it's likely a replaced migration.
+ # Reload the graph without replacements.
+ elif (
+ self.loader.replace_migrations
+ and target not in self.loader.graph.node_map
+ ):
+ self.loader.replace_migrations = False
+ self.loader.build_graph()
+ return self.migration_plan(targets, clean_start=clean_start)
# If the migration is already applied, do backwards mode,
# otherwise do forwards mode.
elif target in applied:
- # If the target is missing, it's likely a replaced migration.
- # Reload the graph without replacements.
- if (
- self.loader.replace_migrations
- and target not in self.loader.graph.node_map
- ):
- self.loader.replace_migrations = False
- self.loader.build_graph()
- return self.migration_plan(targets, clean_start=clean_start)
# Don't migrate backwards all the way to the target node (that
# may roll back dependencies in other apps that don't need to
# be rolled back); instead roll back through target's immediate
diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py
index 3b4da2bbb7..00f97c5f3a 100644
--- a/tests/migrations/test_commands.py
+++ b/tests/migrations/test_commands.py
@@ -1331,6 +1331,16 @@ class MigrateTests(MigrationTestBase):
@override_settings(
MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed"}
)
+ def test_migrate_forward_to_squashed_migration(self):
+ try:
+ call_command("migrate", "migrations", "0001_initial", verbosity=0)
+ finally:
+ # Unmigrate everything.
+ call_command("migrate", "migrations", "zero", verbosity=0)
+
+ @override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed"}
+ )
def test_migrate_backward_to_squashed_migration(self):
try:
call_command("migrate", "migrations", "0001_squashed_0002", verbosity=0)