summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2017-08-08 02:06:15 +0500
committerTim Graham <timograham@gmail.com>2017-08-07 17:06:15 -0400
commitca46f4688cd609ec3a056fc4c66fb17176a9d712 (patch)
tree6dfedb89fb183eef8859f69c8d025c6b342b60f6
parent50a97edc1a01f3d5325f0be1b91e7c77c3ba7dc0 (diff)
Refs #28459 -- Improved performance of SQLCompiler.results_iter().
-rw-r--r--django/db/models/query.py4
-rw-r--r--django/db/models/sql/compiler.py28
-rw-r--r--django/db/models/sql/query.py2
3 files changed, 18 insertions, 16 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index c625da4bdc..0b65bb56e8 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1227,9 +1227,9 @@ class RawQuerySet:
converters = compiler.get_converters([
f.get_col(f.model._meta.db_table) if f else None for f in fields
])
+ if converters:
+ query = compiler.apply_converters(query, converters)
for values in query:
- if converters:
- values = compiler.apply_converters(values, converters)
# Associate fields to values
model_init_values = [values[pos] for pos in model_init_pos]
instance = model_cls.from_db(db, model_init_names, model_init_values)
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 5ae5213b14..d6caa34328 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -938,14 +938,17 @@ class SQLCompiler:
converters[i] = (convs, expression)
return converters
- def apply_converters(self, row, converters):
- row = list(row)
- for pos, (convs, expression) in converters.items():
- value = row[pos]
- for converter in convs:
- value = converter(value, expression, self.connection)
- row[pos] = value
- return tuple(row)
+ def apply_converters(self, rows, converters):
+ connection = self.connection
+ converters = list(converters.items())
+ for row in rows:
+ row = list(row)
+ for pos, (convs, expression) in converters:
+ value = row[pos]
+ for converter in convs:
+ value = converter(value, expression, connection)
+ row[pos] = value
+ yield tuple(row)
def results_iter(self, results=None):
"""Return an iterator over the results from executing this query."""
@@ -953,11 +956,10 @@ class SQLCompiler:
results = self.execute_sql(MULTI)
fields = [s[0] for s in self.select[0:self.col_count]]
converters = self.get_converters(fields)
- for rows in results:
- for row in rows:
- if converters:
- row = self.apply_converters(row, converters)
- yield row
+ rows = chain.from_iterable(results)
+ if converters:
+ rows = self.apply_converters(rows, converters)
+ return rows
def has_results(self):
"""
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index bf21c66f20..1eb8598690 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -464,7 +464,7 @@ class Query:
result = [None for q in outer_query.annotation_select.items()]
converters = compiler.get_converters(outer_query.annotation_select.values())
- result = compiler.apply_converters(result, converters)
+ result = next(compiler.apply_converters((result,), converters))
return {
alias: val