diff options
| author | Sergey Fedoseev <fedoseev.sergey@gmail.com> | 2017-12-22 05:50:56 +0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-12-21 19:50:56 -0500 |
| commit | ebc4ee3369694e6dca5cf216d4176bdefd930fd6 (patch) | |
| tree | db7595fae1fe774c02fea051d69b6eb0efef4333 /django/db/backends/sqlite3/operations.py | |
| parent | ad9390bba27cb41da92f734db4d0e36ef3dfc58f (diff) | |
Refs #23941 -- Prevented incorrect rounding of DecimalField annotations on SQLite.
Diffstat (limited to 'django/db/backends/sqlite3/operations.py')
| -rw-r--r-- | django/db/backends/sqlite3/operations.py | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/django/db/backends/sqlite3/operations.py b/django/db/backends/sqlite3/operations.py index 61514a7642..b58c344e6b 100644 --- a/django/db/backends/sqlite3/operations.py +++ b/django/db/backends/sqlite3/operations.py @@ -1,12 +1,13 @@ import datetime +import decimal import uuid -from decimal import Decimal from django.conf import settings from django.core.exceptions import FieldError from django.db import utils from django.db.backends.base.operations import BaseDatabaseOperations from django.db.models import aggregates, fields +from django.db.models.expressions import Col from django.utils import timezone from django.utils.dateparse import parse_date, parse_datetime, parse_time from django.utils.duration import duration_string @@ -242,8 +243,12 @@ class DatabaseOperations(BaseDatabaseOperations): def convert_decimalfield_value(self, value, expression, connection): if value is not None: + if not isinstance(expression, Col): + # SQLite stores only 15 significant digits. Digits coming from + # float inaccuracy must be removed. + return decimal.Context(prec=15).create_decimal_from_float(value) value = expression.output_field.format_number(value) - value = Decimal(value) + return decimal.Decimal(value) return value def convert_uuidfield_value(self, value, expression, connection): |
