1
0
mirror of https://github.com/django/django.git synced 2025-04-17 22:04:38 +00:00

[3.1.x] Fixed -- Avoided subquery usage on QuerySet.all().delete().

Thanks Adam Johnson for the report.

Regression in 7acef095d73322f45dcceb99afa1a4e50b520479.

Backport of 972000420e08703dd4981466ff67adcd5a61ad4b from master
This commit is contained in:
Simon Charette 2020-05-24 09:18:12 -04:00 committed by Mariusz Felisiak
parent 6e3c543909
commit d91095def4
2 changed files with 8 additions and 0 deletions
django/db/models/sql
tests/delete

@ -1400,6 +1400,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):

@ -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(