summaryrefslogtreecommitdiff
path: root/django/db/backends/sqlite3/operations.py
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2017-12-22 05:50:56 +0500
committerTim Graham <timograham@gmail.com>2017-12-21 19:50:56 -0500
commitebc4ee3369694e6dca5cf216d4176bdefd930fd6 (patch)
treedb7595fae1fe774c02fea051d69b6eb0efef4333 /django/db/backends/sqlite3/operations.py
parentad9390bba27cb41da92f734db4d0e36ef3dfc58f (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.py9
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):