Refs #28459 -- Improved performance of SQLCompiler.results_iter().
This commit is contained in:
parent
50a97edc1a
commit
ca46f4688c
|
@ -1227,9 +1227,9 @@ class RawQuerySet:
|
||||||
converters = compiler.get_converters([
|
converters = compiler.get_converters([
|
||||||
f.get_col(f.model._meta.db_table) if f else None for f in fields
|
f.get_col(f.model._meta.db_table) if f else None for f in fields
|
||||||
])
|
])
|
||||||
for values in query:
|
|
||||||
if converters:
|
if converters:
|
||||||
values = compiler.apply_converters(values, converters)
|
query = compiler.apply_converters(query, converters)
|
||||||
|
for values in query:
|
||||||
# Associate fields to values
|
# Associate fields to values
|
||||||
model_init_values = [values[pos] for pos in model_init_pos]
|
model_init_values = [values[pos] for pos in model_init_pos]
|
||||||
instance = model_cls.from_db(db, model_init_names, model_init_values)
|
instance = model_cls.from_db(db, model_init_names, model_init_values)
|
||||||
|
|
|
@ -938,14 +938,17 @@ class SQLCompiler:
|
||||||
converters[i] = (convs, expression)
|
converters[i] = (convs, expression)
|
||||||
return converters
|
return converters
|
||||||
|
|
||||||
def apply_converters(self, row, converters):
|
def apply_converters(self, rows, converters):
|
||||||
|
connection = self.connection
|
||||||
|
converters = list(converters.items())
|
||||||
|
for row in rows:
|
||||||
row = list(row)
|
row = list(row)
|
||||||
for pos, (convs, expression) in converters.items():
|
for pos, (convs, expression) in converters:
|
||||||
value = row[pos]
|
value = row[pos]
|
||||||
for converter in convs:
|
for converter in convs:
|
||||||
value = converter(value, expression, self.connection)
|
value = converter(value, expression, connection)
|
||||||
row[pos] = value
|
row[pos] = value
|
||||||
return tuple(row)
|
yield tuple(row)
|
||||||
|
|
||||||
def results_iter(self, results=None):
|
def results_iter(self, results=None):
|
||||||
"""Return an iterator over the results from executing this query."""
|
"""Return an iterator over the results from executing this query."""
|
||||||
|
@ -953,11 +956,10 @@ class SQLCompiler:
|
||||||
results = self.execute_sql(MULTI)
|
results = self.execute_sql(MULTI)
|
||||||
fields = [s[0] for s in self.select[0:self.col_count]]
|
fields = [s[0] for s in self.select[0:self.col_count]]
|
||||||
converters = self.get_converters(fields)
|
converters = self.get_converters(fields)
|
||||||
for rows in results:
|
rows = chain.from_iterable(results)
|
||||||
for row in rows:
|
|
||||||
if converters:
|
if converters:
|
||||||
row = self.apply_converters(row, converters)
|
rows = self.apply_converters(rows, converters)
|
||||||
yield row
|
return rows
|
||||||
|
|
||||||
def has_results(self):
|
def has_results(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -464,7 +464,7 @@ class Query:
|
||||||
result = [None for q in outer_query.annotation_select.items()]
|
result = [None for q in outer_query.annotation_select.items()]
|
||||||
|
|
||||||
converters = compiler.get_converters(outer_query.annotation_select.values())
|
converters = compiler.get_converters(outer_query.annotation_select.values())
|
||||||
result = compiler.apply_converters(result, converters)
|
result = next(compiler.apply_converters((result,), converters))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
alias: val
|
alias: val
|
||||||
|
|
Loading…
Reference in New Issue