Fixed #29209 -- Fixed Cast() with TextField on MySQL and Oracle.

This commit is contained in:
Sergey Fedoseev 2018-03-13 06:57:14 +05:00 committed by Tim Graham
parent c12745f682
commit d696fccae6
3 changed files with 7 additions and 0 deletions

View File

@ -18,6 +18,7 @@ class DatabaseOperations(BaseDatabaseOperations):
} }
cast_data_types = { cast_data_types = {
'CharField': 'char(%(max_length)s)', 'CharField': 'char(%(max_length)s)',
'TextField': 'char',
'IntegerField': 'signed integer', 'IntegerField': 'signed integer',
'BigIntegerField': 'signed integer', 'BigIntegerField': 'signed integer',
'SmallIntegerField': 'signed integer', 'SmallIntegerField': 'signed integer',

View File

@ -51,6 +51,9 @@ END;
# Oracle doesn't support string without precision; use the max string size. # Oracle doesn't support string without precision; use the max string size.
cast_char_field_without_max_length = 'NVARCHAR2(2000)' cast_char_field_without_max_length = 'NVARCHAR2(2000)'
cast_data_types = {
'TextField': cast_char_field_without_max_length,
}
def cache_key_culling_sql(self): def cache_key_culling_sql(self):
return """ return """

View File

@ -74,3 +74,6 @@ class CastTests(TestCase):
""" """
list(Author.objects.annotate(cast_float=Cast(Avg('age'), models.FloatField()))) list(Author.objects.annotate(cast_float=Cast(Avg('age'), models.FloatField())))
self.assertIn('(AVG("db_functions_author"."age"))::double precision', connection.queries[-1]['sql']) self.assertIn('(AVG("db_functions_author"."age"))::double precision', connection.queries[-1]['sql'])
def test_cast_to_text_field(self):
self.assertEqual(Author.objects.values_list(Cast('age', models.TextField()), flat=True).get(), '1')