summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2017-06-21 16:16:53 +0200
committerTim Graham <timograham@gmail.com>2017-06-21 10:16:53 -0400
commit0f91ba1adc037345474749faa64d36a4077b3fb8 (patch)
tree17b49f8776336e96c11e4485583df4adf73d79e1
parenta96b981d84367fd41b1df40adf3ac9ca71a741dd (diff)
Fixed #28329 -- Fixed Cast() with Big/Small/Positive/PositiveSmallIntegerField on MySQL.
-rw-r--r--django/db/models/functions/base.py4
-rw-r--r--tests/db_functions/test_cast.py14
2 files changed, 17 insertions, 1 deletions
diff --git a/django/db/models/functions/base.py b/django/db/models/functions/base.py
index 7fd396d609..c487bb4ab5 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 39d4f44f9c..70de20e5eb 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)