Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #10100 -- Corrected handling of the negation required exclude()…

… clauses that reference aggregate columns. Thanks to Anossov for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9785 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit ed3d2735a2eb5d279e2098e14437eb9e445498c6 1 parent ef22bb7
@freakboy3742 freakboy3742 authored
View
6 django/db/models/sql/query.py
@@ -1266,7 +1266,11 @@ def add_filter(self, filter_expr, connector=AND, negate=False, trim=False,
for alias, aggregate in self.aggregate_select.items():
if alias == parts[0]:
- self.having.add((aggregate, lookup_type, value), AND)
+ entry = self.where_class()
+ entry.add((aggregate, lookup_type, value), AND)
+ if negate:
+ entry.negate()
+ self.having.add(entry, AND)
return
opts = self.get_meta()
View
13 tests/regressiontests/aggregation_regress/models.py
@@ -151,6 +151,19 @@ def __unicode__(self):
>>> Book.objects.select_related('publisher').annotate(num_authors=Count('authors')).values()[0]
{'rating': 4.0, 'isbn': u'013790395', 'name': u'Artificial Intelligence: A Modern Approach', 'pubdate': datetime.date(1995, 1, 15), 'price': Decimal("82.8..."), 'id': 5, 'num_authors': 2, 'publisher_id': 3, 'pages': 1132}
+# Regression for #10010: exclude on an aggregate field is correctly negated
+>>> len(Book.objects.annotate(num_authors=Count('authors')))
+6
+>>> len(Book.objects.annotate(num_authors=Count('authors')).filter(num_authors__gt=2))
+1
+>>> len(Book.objects.annotate(num_authors=Count('authors')).exclude(num_authors__gt=2))
+5
+
+>>> len(Book.objects.annotate(num_authors=Count('authors')).filter(num_authors__lt=3).exclude(num_authors__lt=2))
+2
+>>> len(Book.objects.annotate(num_authors=Count('authors')).exclude(num_authors__lt=2).filter(num_authors__lt=3))
+2
+
"""
}
Please sign in to comment.
Something went wrong with that request. Please try again.