[1.8.x] Fixed #26324 -- Fixed DurationField with fractional seconds on SQLite.

Backport of 4f0cd0fd16 from master
This commit is contained in:
Tim Graham 2016-03-10 09:22:09 -05:00
parent ae4d932b1a
commit c7764ca3a0
3 changed files with 11 additions and 1 deletions

View File

@ -1680,7 +1680,8 @@ class DurationField(Field):
return value
if value is None:
return None
return value.total_seconds() * 1000000
# Discard any fractional microseconds due to floating point arithmetic.
return int(round(value.total_seconds() * 1000000))
def get_db_converters(self, connection):
converters = []

View File

@ -12,3 +12,6 @@ Bugfixes
* Made ``MultiPartParser`` ignore filenames that normalize to an empty string
to fix crash in ``MemoryFileUploadHandler`` on specially crafted user input
(:ticket:`26325`).
* Fixed data loss on SQLite where ``DurationField`` values with fractional
seconds could be saved as ``None`` (:ticket:`26324`).

View File

@ -22,6 +22,12 @@ class TestSaveLoad(TestCase):
loaded = NullDurationModel.objects.get()
self.assertEqual(loaded.field, None)
def test_fractional_seconds(self):
value = datetime.timedelta(seconds=2.05)
d = DurationModel.objects.create(field=value)
d.refresh_from_db()
self.assertEqual(d.field, value)
class TestQuerying(TestCase):