Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #14476 -- Fixed resolution of automatically generated annotatio…

…n names so e.g. filtering based on them works. Thanks dirleyls for the report and patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16252 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 15793309e16dcdf5de17594eaef1962a7c35ce31 1 parent 803a454
Ramiro Morales ramiro authored
16 django/db/models/sql/query.py
View
@@ -1053,14 +1053,14 @@ def add_filter(self, filter_expr, connector=AND, negate=False, trim=False,
value = SQLEvaluator(value, self)
having_clause = value.contains_aggregate
- if parts[0] in self.aggregates:
- aggregate = self.aggregates[parts[0]]
- entry = self.where_class()
- entry.add((aggregate, lookup_type, value), AND)
- if negate:
- entry.negate()
- self.having.add(entry, connector)
- return
+ for alias, aggregate in self.aggregates.items():
+ if alias in (parts[0], LOOKUP_SEP.join(parts)):
+ entry = self.where_class()
+ entry.add((aggregate, lookup_type, value), AND)
+ if negate:
+ entry.negate()
+ self.having.add(entry, connector)
+ return
opts = self.get_meta()
alias = self.get_initial_alias()
27 tests/regressiontests/aggregation_regress/tests.py
View
@@ -827,3 +827,30 @@ def test_stddev(self):
Book.objects.aggregate(Variance('price', sample=True)),
{'price__variance': Approximate(700.53, 2)}
)
+
+ def test_filtering_by_annotation_name(self):
+ # Regression test for #14476
+
+ # The name of the explicitly provided annotation name in this case
+ # poses no problem
+ qs = Author.objects.annotate(book_cnt=Count('book')).filter(book_cnt=2)
+ self.assertQuerysetEqual(
+ qs,
+ ['Peter Norvig'],
+ lambda b: b.name
+ )
+ # Neither in this case
+ qs = Author.objects.annotate(book_count=Count('book')).filter(book_count=2)
+ self.assertQuerysetEqual(
+ qs,
+ ['Peter Norvig'],
+ lambda b: b.name
+ )
+ # This case used to fail because the ORM couldn't resolve the
+ # automatically generated annotation name `book__count`
+ qs = Author.objects.annotate(Count('book')).filter(book__count=2)
+ self.assertQuerysetEqual(
+ qs,
+ ['Peter Norvig'],
+ lambda b: b.name
+ )
Please sign in to comment.
Something went wrong with that request. Please try again.