summaryrefslogtreecommitdiff
path: root/tests/expressions_case
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2015-05-19 14:49:00 +0300
committerTim Graham <timograham@gmail.com>2015-05-20 09:41:04 -0400
commitbc87061a3c7c8d6b4d2469f35cc78683c6cff647 (patch)
tree6a3eec0238a14a0a57c87bc63b3aac5f87f3fa40 /tests/expressions_case
parent8b106cfaa07dc04ad27a1a90c1eb03af80111695 (diff)
Fixed #24705 -- Fixed negated Q objects in expressions.
Avoided split_exclude() for Q when used as an expression.
Diffstat (limited to 'tests/expressions_case')
-rw-r--r--tests/expressions_case/tests.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/expressions_case/tests.py b/tests/expressions_case/tests.py
index 3479932865..6d35be8865 100644
--- a/tests/expressions_case/tests.py
+++ b/tests/expressions_case/tests.py
@@ -1048,6 +1048,48 @@ class CaseExpressionTests(TestCase):
lambda x: (x, x.foo)
)
+ def test_m2m_exclude(self):
+ CaseTestModel.objects.create(integer=10, integer2=1, string='1')
+ qs = CaseTestModel.objects.values_list('id', 'integer').annotate(
+ cnt=models.Sum(
+ Case(When(~Q(fk_rel__integer=1), then=1), default=2),
+ output_field=models.IntegerField()
+ ),
+ ).order_by('integer')
+ # The first o has 2 as its fk_rel__integer=1, thus it hits the
+ # default=2 case. The other ones have 2 as the result as they have 2
+ # fk_rel objects, except for integer=4 and integer=10 (created above).
+ # The integer=4 case has one integer, thus the result is 1, and
+ # integer=10 doesn't have any and this too generates 1 (instead of 0)
+ # as ~Q() also matches nulls.
+ self.assertQuerysetEqual(
+ qs,
+ [(1, 2), (2, 2), (2, 2), (3, 2), (3, 2), (3, 2), (4, 1), (10, 1)],
+ lambda x: x[1:]
+ )
+
+ def test_m2m_reuse(self):
+ CaseTestModel.objects.create(integer=10, integer2=1, string='1')
+ # Need to use values before annotate so that Oracle will not group
+ # by fields it isn't capable of grouping by.
+ qs = CaseTestModel.objects.values_list('id', 'integer').annotate(
+ cnt=models.Sum(
+ Case(When(~Q(fk_rel__integer=1), then=1), default=2),
+ output_field=models.IntegerField()
+ ),
+ ).annotate(
+ cnt2=models.Sum(
+ Case(When(~Q(fk_rel__integer=1), then=1), default=2),
+ output_field=models.IntegerField()
+ ),
+ ).order_by('integer')
+ self.assertEqual(str(qs.query).count(' JOIN '), 1)
+ self.assertQuerysetEqual(
+ qs,
+ [(1, 2, 2), (2, 2, 2), (2, 2, 2), (3, 2, 2), (3, 2, 2), (3, 2, 2), (4, 1, 1), (10, 1, 1)],
+ lambda x: x[1:]
+ )
+
class CaseDocumentationExamples(TestCase):
@classmethod