From 368e0741926f41000960b4d34aa880f2d202d1f1 Mon Sep 17 00:00:00 2001 From: "utkarsh.arya@zomato.com" Date: Sat, 15 Nov 2025 22:58:55 +0000 Subject: [PATCH] Fix performance regression in Model.objects.all().delete() Avoid generating unnecessary subquery for full table deletes to restore fast deletes and compatibility with MySQL LOCK TABLES. References #660 --- django/db/models/sql/compiler.py | 2 ++ tests/delete/tests.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 29e33c075f..a1487c4f95 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1407,6 +1407,8 @@ class SQLInsertCompiler(SQLCompiler): class SQLDeleteCompiler(SQLCompiler): @cached_property def single_alias(self): + # Ensure base table is in aliases. + self.query.get_initial_alias() return sum(self.query.alias_refcount[t] > 0 for t in self.query.alias_map) == 1 def _as_sql(self, query): diff --git a/tests/delete/tests.py b/tests/delete/tests.py index c32ebba83f..9cc978fd93 100644 --- a/tests/delete/tests.py +++ b/tests/delete/tests.py @@ -606,6 +606,13 @@ class DeletionTests(TestCase): class FastDeleteTests(TestCase): + def test_fast_delete_all(self): + with self.assertNumQueries(1) as ctx: + User.objects.all().delete() + sql = ctx.captured_queries[0]['sql'] + # No subqueries is used when performing a full delete. + self.assertNotIn('SELECT', sql) + def test_fast_delete_fk(self): u = User.objects.create( avatar=Avatar.objects.create()