diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2015-05-19 14:49:00 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-05-20 09:41:04 -0400 |
| commit | bc87061a3c7c8d6b4d2469f35cc78683c6cff647 (patch) | |
| tree | 6a3eec0238a14a0a57c87bc63b3aac5f87f3fa40 /tests/expressions_case | |
| parent | 8b106cfaa07dc04ad27a1a90c1eb03af80111695 (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.py | 42 |
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 |
