Sfoglia il codice sorgente

Refs #26071 -- Added test for __in lookup in a Case expression.

Forwardport of 5b3c66d8b64add684489f5010e43de73e7acdd04 from stable/1.8.x
Alberto Avila 9 anni fa
parent
commit
cca151d196
2 ha cambiato i file con 15 aggiunte e 1 eliminazioni
  1. 3 0
      docs/releases/1.8.9.txt
  2. 12 1
      tests/expressions_case/tests.py

+ 3 - 0
docs/releases/1.8.9.txt

@@ -23,3 +23,6 @@ Bugfixes
   ``db_index=True`` or ``unique=True`` to a ``CharField`` or ``TextField`` that
   already had the other specified, or when removing one of them from a field
   that had both (:ticket:`26034`).
+
+* Fixed a crash when using an ``__in`` lookup inside a ``Case`` expression
+  (:ticket:`26071`).

+ 12 - 1
tests/expressions_case/tests.py

@@ -8,7 +8,7 @@ from uuid import UUID
 
 from django.core.exceptions import FieldError
 from django.db import connection, models
-from django.db.models import F, Q, Max, Min, Value
+from django.db.models import F, Q, Max, Min, Sum, Value
 from django.db.models.expressions import Case, When
 from django.test import TestCase
 from django.utils import six
@@ -119,6 +119,17 @@ class CaseExpressionTests(TestCase):
             transform=attrgetter('integer', 'join_test')
         )
 
+    def test_annotate_with_in_clause(self):
+        fk_rels = FKCaseTestModel.objects.filter(integer__in=[5])
+        self.assertQuerysetEqual(
+            CaseTestModel.objects.only('pk', 'integer').annotate(in_test=Sum(Case(
+                When(fk_rel__in=fk_rels, then=F('fk_rel__integer')),
+                default=Value(0),
+            ))).order_by('pk'),
+            [(1, 0), (2, 0), (3, 0), (2, 0), (3, 0), (3, 0), (4, 5)],
+            transform=attrgetter('integer', 'in_test')
+        )
+
     def test_annotate_with_join_in_condition(self):
         self.assertQuerysetEqual(
             CaseTestModel.objects.annotate(join_test=Case(