浏览代码

Fixed #31624 -- Avoided subquery usage on QuerySet.all().delete().

Thanks Adam Johnson for the report.

Regression in 7acef095d73322f45dcceb99afa1a4e50b520479.
Simon Charette 4 年之前
父节点
当前提交
972000420e
共有 2 个文件被更改,包括 8 次插入0 次删除
  1. 2 0
      django/db/models/sql/compiler.py
  2. 6 0
      tests/delete/tests.py

+ 2 - 0
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):

+ 6 - 0
tests/delete/tests.py

@@ -605,6 +605,12 @@ 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(