diff options
| author | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-03-30 08:18:18 -0400 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2025-04-01 09:35:37 +0200 |
| commit | a0fb35eb726f1a04eaa1b47b8de191fafe55a0ab (patch) | |
| tree | 8783e5f447feeb4b5201900b1628511ebcee0118 | |
| parent | 12385b4fa7059aab8e4f671853cc09ae8509501f (diff) | |
Fixed #36184 -- Allowed migrating forward to squashed migrations.
| -rw-r--r-- | django/db/migrations/executor.py | 18 | ||||
| -rw-r--r-- | tests/migrations/test_commands.py | 10 |
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) |
