|
@@ -6,7 +6,7 @@ from decimal import Decimal
|
|
|
from django.core.exceptions import FieldDoesNotExist, FieldError
|
|
|
from django.db.models import (
|
|
|
BooleanField, CharField, Count, DateTimeField, ExpressionWrapper, F, Func,
|
|
|
- IntegerField, Sum, Value,
|
|
|
+ IntegerField, Q, Sum, Value,
|
|
|
)
|
|
|
from django.db.models.functions import Lower
|
|
|
from django.test import TestCase, skipUnlessDBFeature
|
|
@@ -148,6 +148,19 @@ class NonAggregateAnnotationTestCase(TestCase):
|
|
|
combined = int(test.pages + test.rating)
|
|
|
self.assertEqual(b.combined, combined)
|
|
|
|
|
|
+ def test_empty_expression_annotation(self):
|
|
|
+ books = Book.objects.annotate(
|
|
|
+ selected=ExpressionWrapper(Q(pk__in=[]), output_field=BooleanField())
|
|
|
+ )
|
|
|
+ self.assertEqual(len(books), Book.objects.count())
|
|
|
+ self.assertTrue(all(not book.selected for book in books))
|
|
|
+
|
|
|
+ books = Book.objects.annotate(
|
|
|
+ selected=ExpressionWrapper(Q(pk__in=Book.objects.none()), output_field=BooleanField())
|
|
|
+ )
|
|
|
+ self.assertEqual(len(books), Book.objects.count())
|
|
|
+ self.assertTrue(all(not book.selected for book in books))
|
|
|
+
|
|
|
def test_annotate_with_aggregation(self):
|
|
|
books = Book.objects.annotate(
|
|
|
is_book=Value(1, output_field=IntegerField()),
|