From 8f410a577befddeff8639410a7a85d8e6d1c86e7 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 2 Feb 2009 13:43:18 +0000 Subject: [PATCH] Fixed #10127 -- Corrected handling of select_related() in annotate() calls. Thanks to Sylvain Pasche for the report and test case. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9805 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/query.py | 4 ++-- django/db/models/sql/query.py | 2 +- tests/regressiontests/aggregation_regress/models.py | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/django/db/models/query.py b/django/db/models/query.py index 04a1c513f6..aa2034919c 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -280,8 +280,8 @@ class QuerySet(object): for row in self.query.results_iter(): if fill_cache: - obj, aggregate_start = get_cached_row(self.model, row, - index_start, max_depth, requested=requested) + obj, _ = get_cached_row(self.model, row, + index_start, max_depth, requested=requested) else: # omit aggregates in object creation obj = self.model(*row[index_start:aggregate_start]) diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 4e46da6424..bf664c606e 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -698,7 +698,7 @@ class BaseQuery(object): """ qn = self.quote_name_unless_alias result = [] - for col in self.group_by: + for col in self.group_by + self.related_select_cols: if isinstance(col, (list, tuple)): result.append('%s.%s' % (qn(col[0]), qn(col[1]))) elif hasattr(col, 'as_sql'): diff --git a/tests/regressiontests/aggregation_regress/models.py b/tests/regressiontests/aggregation_regress/models.py index d7dd7617e6..3e5f873472 100644 --- a/tests/regressiontests/aggregation_regress/models.py +++ b/tests/regressiontests/aggregation_regress/models.py @@ -194,6 +194,11 @@ FieldError: Cannot resolve keyword 'foo' into field. Choices are: authors, id, i >>> Book.objects.annotate(num_authors=Count('authors')).order_by('publisher__name', 'name') [, , , , , ] +# Regression for #10127 - Empty select_related() works with annotate +>>> books = Book.objects.all().filter(rating__lt=4.5).select_related().annotate(Avg('authors__age')) +>>> sorted([(b.name, b.authors__age__avg) for b in books]) +[(u'Artificial Intelligence: A Modern Approach', 51.5), (u'Practical Django Projects', 29.0), (u'Python Web Development with Django', 30.3...), (u'Sams Teach Yourself Django in 24 Hours', 45.0)] + """ }