Skip to content

Commit 94675a7

Browse files
committed
[3.2.x] Fixed #32793 -- Fixed loss of precision for temporal operations with DecimalFields on MySQL.
Regression in 1e38f11. Thanks Mohsen Tamiz for the report. Backport of e703b15 from main
1 parent b2ff165 commit 94675a7

File tree

4 files changed

+15
-1
lines changed

4 files changed

+15
-1
lines changed

django/db/backends/mysql/operations.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ def force_no_ordering(self):
160160
"""
161161
return [(None, ("NULL", [], False))]
162162

163+
def adapt_decimalfield_value(self, value, max_digits=None, decimal_places=None):
164+
return value
165+
163166
def last_executed_query(self, cursor, sql, params):
164167
# With MySQLdb, cursor objects have an (undocumented) "_executed"
165168
# attribute where the exact query sent to the database is saved.

docs/releases/3.2.4.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,6 @@ Bugfixes
2828

2929
* Fixed a regression in Django 3.2 that caused a crash of auto-reloader with
3030
``AttributeError``, e.g. inside a ``Conda`` environment (:ticket:`32783`).
31+
32+
* Fixed a regression in Django 3.2 that caused a loss of precision for
33+
operations with ``DecimalField`` on MySQL (:ticket:`32793`).

tests/expressions/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,10 @@ def __str__(self):
4848
class Number(models.Model):
4949
integer = models.BigIntegerField(db_column='the_integer')
5050
float = models.FloatField(null=True, db_column='the_float')
51+
decimal_value = models.DecimalField(max_digits=20, decimal_places=17, null=True)
5152

5253
def __str__(self):
53-
return '%i, %.3f' % (self.integer, self.float)
54+
return '%i, %.3f, %.17f' % (self.integer, self.float, self.decimal_value)
5455

5556

5657
class Experiment(models.Model):

tests/expressions/tests.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,13 @@ def test_complex_expressions(self):
11761176
self.assertEqual(Number.objects.get(pk=n.pk).integer, 10)
11771177
self.assertEqual(Number.objects.get(pk=n.pk).float, Approximate(256.900, places=3))
11781178

1179+
def test_decimal_expression(self):
1180+
n = Number.objects.create(integer=1, decimal_value=Decimal('0.5'))
1181+
n.decimal_value = F('decimal_value') - Decimal('0.4')
1182+
n.save()
1183+
n.refresh_from_db()
1184+
self.assertEqual(n.decimal_value, Decimal('0.1'))
1185+
11791186

11801187
class ExpressionOperatorTests(TestCase):
11811188
@classmethod

0 commit comments

Comments
 (0)