Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

[1.2.X] Fixed #14697 - speeded up model instance creation by moving w…

…ork outside of loops

Thanks to akaariai for the report and initial patch.

Backport of [14687] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@14688 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 1c451c0f395a14e426c17a8eb059669fa3d0d7ab 1 parent c2de746
@spookylukey spookylukey authored
Showing with 16 additions and 10 deletions.
  1. +14 −9 django/db/models/query.py
  2. +2 −1  django/db/models/sql/compiler.py
View
23 django/db/models/query.py
@@ -264,11 +264,14 @@ def iterator(self):
init_list.append(field.attname)
model_cls = deferred_class_factory(self.model, skip)
- compiler = self.query.get_compiler(using=self.db)
+ # Cache db and model outside the loop
+ db = self.db
+ model = self.model
+ compiler = self.query.get_compiler(using=db)
for row in compiler.results_iter():
if fill_cache:
- obj, _ = get_cached_row(self.model, row,
- index_start, using=self.db, max_depth=max_depth,
+ obj, _ = get_cached_row(model, row,
+ index_start, using=db, max_depth=max_depth,
requested=requested, offset=len(aggregate_select),
only_load=only_load)
else:
@@ -278,19 +281,21 @@ def iterator(self):
obj = model_cls(**dict(zip(init_list, row_data)))
else:
# Omit aggregates in object creation.
- obj = self.model(*row[index_start:aggregate_start])
+ obj = model(*row[index_start:aggregate_start])
# Store the source database of the object
- obj._state.db = self.db
+ obj._state.db = db
# This object came from the database; it's not being added.
obj._state.adding = False
- for i, k in enumerate(extra_select):
- setattr(obj, k, row[i])
+ if extra_select:
+ for i, k in enumerate(extra_select):
+ setattr(obj, k, row[i])
# Add the aggregates to the model
- for i, aggregate in enumerate(aggregate_select):
- setattr(obj, aggregate, row[i+aggregate_start])
+ if aggregate_select:
+ for i, aggregate in enumerate(aggregate_select):
+ setattr(obj, aggregate, row[i+aggregate_start])
yield obj
View
3  django/db/models/sql/compiler.py
@@ -669,6 +669,7 @@ def results_iter(self):
"""
resolve_columns = hasattr(self, 'resolve_columns')
fields = None
+ has_aggregate_select = bool(self.query.aggregate_select)
for rows in self.execute_sql(MULTI):
for row in rows:
if resolve_columns:
@@ -689,7 +690,7 @@ def results_iter(self):
f.column in only_load[db_table]]
row = self.resolve_columns(row, fields)
- if self.query.aggregate_select:
+ if has_aggregate_select:
aggregate_start = len(self.query.extra_select.keys()) + len(self.query.select)
aggregate_end = aggregate_start + len(self.query.aggregate_select)
row = tuple(row[:aggregate_start]) + tuple([
Please sign in to comment.
Something went wrong with that request. Please try again.