summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Sokolovskiy <me@asokolovskiy.com>2015-06-05 11:10:51 +0100
committerTim Graham <timograham@gmail.com>2015-06-05 11:21:31 -0400
commit286d0e6ab1e54906007fda86b6cb6deb26c6deb2 (patch)
tree79220390d768977f3eb3b4d072e9ffdfe1bd37c6
parentcbe4efcbc13ad402bf1f1a94b02a8ec93f20327d (diff)
Refs #24833 -- Forwardported some of "Fixed Case expressions with exclude()."
Partial forwardport of 469f1e362bb9670b174b37da9edd4631aff7badb from stable/1.8.x as the issue was already fixed in master.
-rw-r--r--django/db/models/sql/query.py12
-rw-r--r--docs/releases/1.8.3.txt3
-rw-r--r--tests/expressions_case/tests.py12
3 files changed, 21 insertions, 6 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 88093d4541..55d083bdff 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1026,9 +1026,9 @@ class Query(object):
"""
lookup_splitted = lookup.split(LOOKUP_SEP)
if self._annotations:
- aggregate, aggregate_lookups = refs_expression(lookup_splitted, self.annotations)
- if aggregate:
- return aggregate_lookups, (), aggregate
+ expression, expression_lookups = refs_expression(lookup_splitted, self.annotations)
+ if expression:
+ return expression_lookups, (), expression
_, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
field_parts = lookup_splitted[0:len(lookup_splitted) - len(lookup_parts)]
if len(lookup_parts) == 0:
@@ -1145,7 +1145,7 @@ class Query(object):
arg, value = filter_expr
if not arg:
raise FieldError("Cannot parse keyword query %r" % arg)
- lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
+ lookups, parts, reffed_expression = self.solve_lookup_type(arg)
if not allow_joins and len(parts) > 1:
raise FieldError("Joined field references are not permitted in this query")
@@ -1154,8 +1154,8 @@ class Query(object):
value, lookups, used_joins = self.prepare_lookup_value(value, lookups, can_reuse, allow_joins)
clause = self.where_class()
- if reffed_aggregate:
- condition = self.build_lookup(lookups, reffed_aggregate, value)
+ if reffed_expression:
+ condition = self.build_lookup(lookups, reffed_expression, value)
clause.add(condition, AND)
return clause, []
diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt
index 4f98027f7e..d544183445 100644
--- a/docs/releases/1.8.3.txt
+++ b/docs/releases/1.8.3.txt
@@ -50,3 +50,6 @@ Bugfixes
* Fixed recording of applied status for squashed (replacement) migrations
(:ticket:`24628`).
+
+* Fixed queryset annotations when using ``Case`` expressions with ``exclude()``
+ (:ticket:`24833`).
diff --git a/tests/expressions_case/tests.py b/tests/expressions_case/tests.py
index 6d35be8865..31ec88c7ec 100644
--- a/tests/expressions_case/tests.py
+++ b/tests/expressions_case/tests.py
@@ -240,6 +240,18 @@ class CaseExpressionTests(TestCase):
transform=itemgetter('integer', 'max', 'test')
)
+ def test_annotate_exclude(self):
+ self.assertQuerysetEqual(
+ CaseTestModel.objects.annotate(test=Case(
+ When(integer=1, then=Value('one')),
+ When(integer=2, then=Value('two')),
+ default=Value('other'),
+ output_field=models.CharField(),
+ )).exclude(test='other').order_by('pk'),
+ [(1, 'one'), (2, 'two'), (2, 'two')],
+ transform=attrgetter('integer', 'test')
+ )
+
def test_combined_expression(self):
self.assertQuerysetEqual(
CaseTestModel.objects.annotate(