diff --git a/django/db/models/functions/base.py b/django/db/models/functions/base.py index 7fd396d609d..c487bb4ab5b 100644 --- a/django/db/models/functions/base.py +++ b/django/db/models/functions/base.py @@ -12,7 +12,11 @@ class Cast(Func): mysql_types = { fields.CharField: 'char', fields.IntegerField: 'signed integer', + fields.BigIntegerField: 'signed integer', + fields.SmallIntegerField: 'signed integer', fields.FloatField: 'signed', + fields.PositiveIntegerField: 'unsigned integer', + fields.PositiveSmallIntegerField: 'unsigned integer', } def __init__(self, expression, output_field): diff --git a/tests/db_functions/test_cast.py b/tests/db_functions/test_cast.py index 39d4f44f9c8..70de20e5eb5 100644 --- a/tests/db_functions/test_cast.py +++ b/tests/db_functions/test_cast.py @@ -9,7 +9,7 @@ from .models import Author class CastTests(TestCase): @classmethod def setUpTestData(self): - Author.objects.create(name='Bob', age=1) + Author.objects.create(name='Bob', age=1, alias='1') def test_cast_from_value(self): numbers = Author.objects.annotate(cast_integer=Cast(Value('0'), models.IntegerField())) @@ -19,6 +19,18 @@ class CastTests(TestCase): numbers = Author.objects.annotate(cast_string=Cast('age', models.CharField(max_length=255)),) self.assertEqual(numbers.get().cast_string, '1') + def test_cast_to_integer(self): + for field_class in ( + models.IntegerField, + models.BigIntegerField, + models.SmallIntegerField, + models.PositiveIntegerField, + models.PositiveSmallIntegerField, + ): + with self.subTest(field_class=field_class): + numbers = Author.objects.annotate(cast_int=Cast('alias', field_class())) + self.assertEqual(numbers.get().cast_int, 1) + def test_cast_from_python(self): numbers = Author.objects.annotate(cast_float=Cast(0, models.FloatField())) self.assertEqual(numbers.get().cast_float, 0.0)