Fixed #14476 -- Fixed resolution of automatically generated annotation 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
This commit is contained in:
parent
803a454aef
commit
15793309e1
|
@ -1053,8 +1053,8 @@ class Query(object):
|
||||||
value = SQLEvaluator(value, self)
|
value = SQLEvaluator(value, self)
|
||||||
having_clause = value.contains_aggregate
|
having_clause = value.contains_aggregate
|
||||||
|
|
||||||
if parts[0] in self.aggregates:
|
for alias, aggregate in self.aggregates.items():
|
||||||
aggregate = self.aggregates[parts[0]]
|
if alias in (parts[0], LOOKUP_SEP.join(parts)):
|
||||||
entry = self.where_class()
|
entry = self.where_class()
|
||||||
entry.add((aggregate, lookup_type, value), AND)
|
entry.add((aggregate, lookup_type, value), AND)
|
||||||
if negate:
|
if negate:
|
||||||
|
|
|
@ -827,3 +827,30 @@ class AggregationTests(TestCase):
|
||||||
Book.objects.aggregate(Variance('price', sample=True)),
|
Book.objects.aggregate(Variance('price', sample=True)),
|
||||||
{'price__variance': Approximate(700.53, 2)}
|
{'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
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue