2
0
Эх сурвалжийг харах

Fixed #31987 -- Fixed Cast() with DurationField on MySQL.

Petr Čermák 4 жил өмнө
parent
commit
fc1446073e

+ 1 - 0
django/db/backends/mysql/operations.py

@@ -29,6 +29,7 @@ class DatabaseOperations(BaseDatabaseOperations):
         'PositiveBigIntegerField': 'unsigned integer',
         'PositiveIntegerField': 'unsigned integer',
         'PositiveSmallIntegerField': 'unsigned integer',
+        'DurationField': 'signed integer',
     }
     cast_char_field_without_max_length = 'char'
     explain_prefix = 'EXPLAIN'

+ 10 - 0
tests/db_functions/comparison/test_cast.py

@@ -65,6 +65,16 @@ class CastTests(TestCase):
                 numbers = Author.objects.annotate(cast_int=Cast('alias', field_class()))
                 self.assertEqual(numbers.get().cast_int, 1)
 
+    def test_cast_to_duration(self):
+        duration = datetime.timedelta(days=1, seconds=2, microseconds=3)
+        DTModel.objects.create(duration=duration)
+        dtm = DTModel.objects.annotate(
+            cast_duration=Cast('duration', models.DurationField()),
+            cast_neg_duration=Cast(-duration, models.DurationField()),
+        ).get()
+        self.assertEqual(dtm.cast_duration, duration)
+        self.assertEqual(dtm.cast_neg_duration, -duration)
+
     def test_cast_from_db_datetime_to_date(self):
         dt_value = datetime.datetime(2018, 9, 28, 12, 42, 10, 234567)
         DTModel.objects.create(start_datetime=dt_value)