Commit 1c451c0f authored by Luke Plant's avatar Luke Plant
Browse files

[1.2.X] Fixed #14697 - speeded up model instance creation by moving work 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
parent c2de746e
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -264,11 +264,14 @@ class QuerySet(object):
                    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,17 +281,19 @@ class QuerySet(object):
                    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

            if extra_select:
                for i, k in enumerate(extra_select):
                    setattr(obj, k, row[i])

            # Add the aggregates to the model
            if aggregate_select:
                for i, aggregate in enumerate(aggregate_select):
                    setattr(obj, aggregate, row[i+aggregate_start])

+2 −1
Original line number Diff line number Diff line
@@ -669,6 +669,7 @@ class SQLCompiler(object):
        """
        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 @@ class SQLCompiler(object):
                                      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([