Skip to content

Commit 59fcd2a

Browse files
jfysh-krakenngnpope
authored andcommitted
Fixed #36869 -- Optimized MigrationGraph._generate_plan membership checks.
Previously, `_generate_plan()` relied on list membership checks, resulting in quadratic behavior as the plan grew. On large migration graphs this became a significant performance bottleneck. This change uses `OrderedSet` for the plan, reducing the complexity to linear while preserving insertion order and behavior. Co-authored-by: Nick Pope <nick@nickpope.me.uk>
1 parent d6cca8b commit 59fcd2a

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

django/db/migrations/graph.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from functools import total_ordering
22

33
from django.db.migrations.state import ProjectState
4+
from django.utils.datastructures import OrderedSet
45

56
from .exceptions import CircularDependencyError, NodeNotFoundError
67

@@ -305,12 +306,12 @@ def _nodes_and_edges(self):
305306
)
306307

307308
def _generate_plan(self, nodes, at_end):
308-
plan = []
309+
plan = OrderedSet()
309310
for node in nodes:
310311
for migration in self.forwards_plan(node):
311312
if migration not in plan and (at_end or migration not in nodes):
312-
plan.append(migration)
313-
return plan
313+
plan.add(migration)
314+
return list(plan)
314315

315316
def make_state(self, nodes=None, at_end=True, real_apps=None):
316317
"""

0 commit comments

Comments
 (0)