mirror of https://github.com/django/django.git
Fixed #27481 -- Made SQLite return annotated boolean values as boolean, not integer.
Thanks Simon Charette for review.
This commit is contained in:
parent
967be82443
commit
c7bfcd2f37
|
@ -209,6 +209,8 @@ class DatabaseOperations(BaseDatabaseOperations):
|
||||||
converters.append(self.convert_decimalfield_value)
|
converters.append(self.convert_decimalfield_value)
|
||||||
elif internal_type == 'UUIDField':
|
elif internal_type == 'UUIDField':
|
||||||
converters.append(self.convert_uuidfield_value)
|
converters.append(self.convert_uuidfield_value)
|
||||||
|
elif internal_type in ('NullBooleanField', 'BooleanField'):
|
||||||
|
converters.append(self.convert_booleanfield_value)
|
||||||
return converters
|
return converters
|
||||||
|
|
||||||
def convert_datetimefield_value(self, value, expression, connection, context):
|
def convert_datetimefield_value(self, value, expression, connection, context):
|
||||||
|
@ -242,6 +244,9 @@ class DatabaseOperations(BaseDatabaseOperations):
|
||||||
value = uuid.UUID(value)
|
value = uuid.UUID(value)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def convert_booleanfield_value(self, value, expression, connection, context):
|
||||||
|
return bool(value) if value in (1, 0) else value
|
||||||
|
|
||||||
def bulk_insert_sql(self, fields, placeholder_rows):
|
def bulk_insert_sql(self, fields, placeholder_rows):
|
||||||
return " UNION ALL ".join(
|
return " UNION ALL ".join(
|
||||||
"SELECT %s" % ", ".join(row)
|
"SELECT %s" % ", ".join(row)
|
||||||
|
|
|
@ -6,7 +6,7 @@ from decimal import Decimal
|
||||||
from django.core.exceptions import FieldDoesNotExist, FieldError
|
from django.core.exceptions import FieldDoesNotExist, FieldError
|
||||||
from django.db.models import (
|
from django.db.models import (
|
||||||
BooleanField, CharField, Count, DateTimeField, ExpressionWrapper, F, Func,
|
BooleanField, CharField, Count, DateTimeField, ExpressionWrapper, F, Func,
|
||||||
IntegerField, Q, Sum, Value,
|
IntegerField, NullBooleanField, Q, Sum, Value,
|
||||||
)
|
)
|
||||||
from django.db.models.functions import Lower
|
from django.db.models.functions import Lower
|
||||||
from django.test import TestCase, skipUnlessDBFeature
|
from django.test import TestCase, skipUnlessDBFeature
|
||||||
|
@ -488,3 +488,15 @@ class NonAggregateAnnotationTestCase(TestCase):
|
||||||
],
|
],
|
||||||
lambda c: (c.name, c.tagline_lower)
|
lambda c: (c.name, c.tagline_lower)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_boolean_value_annotation(self):
|
||||||
|
books = Book.objects.annotate(
|
||||||
|
is_book=Value(True, output_field=BooleanField()),
|
||||||
|
is_pony=Value(False, output_field=BooleanField()),
|
||||||
|
is_none=Value(None, output_field=NullBooleanField()),
|
||||||
|
)
|
||||||
|
self.assertGreater(len(books), 0)
|
||||||
|
for book in books:
|
||||||
|
self.assertIs(book.is_book, True)
|
||||||
|
self.assertIs(book.is_pony, False)
|
||||||
|
self.assertIsNone(book.is_none)
|
||||||
|
|
Loading…
Reference in New Issue