From 51297a92324976a704279b567ec4f80bb92d7b60 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Wed, 12 Aug 2020 23:16:22 -0400 Subject: Fixed #31792 -- Made Exists() reuse QuerySet.exists() optimizations. The latter is already optimized to limit the number of results, avoid selecting unnecessary fields, and drop ordering if possible without altering the semantic of the query. --- django/db/models/sql/compiler.py | 3 --- django/db/models/sql/query.py | 8 +++++++- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'django/db/models/sql') diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index fc7a7aafae..b321762303 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1127,9 +1127,6 @@ class SQLCompiler: Backends (e.g. NoSQL) can override this in order to use optimized versions of "query has any results." """ - # This is always executed on a query clone, so we can modify self.query - self.query.add_extra({'a': 1}, None, None, None, None, None) - self.query.set_extra_mask(['a']) return bool(self.execute_sql(SINGLE)) def execute_sql(self, result_type=MULTI, chunked_fetch=False, chunk_size=GET_ITERATOR_CHUNK_SIZE): diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 659fa87314..4648daf395 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -522,7 +522,7 @@ class Query(BaseExpression): def has_filters(self): return self.where - def has_results(self, using): + def exists(self): q = self.clone() if not q.distinct: if q.group_by is True: @@ -533,6 +533,12 @@ class Query(BaseExpression): q.clear_select_clause() q.clear_ordering(True) q.set_limits(high=1) + q.add_extra({'a': 1}, None, None, None, None, None) + q.set_extra_mask(['a']) + return q + + def has_results(self, using): + q = self.exists() compiler = q.get_compiler(using=using) return compiler.has_results() -- cgit v1.3