I upgraded to django 2.1 and some of my unit tests (which use a sqlite 
database) are failing with the following:

  File 
"/home/travis/virtualenv/python3.5.6/lib/python3.5/site-packages/django/db/models/query.py",
 line 268, in __iter__
2113    self._fetch_all()
2114  File 
"/home/travis/virtualenv/python3.5.6/lib/python3.5/site-packages/django/db/models/query.py",
 line 1186, in _fetch_all
2115    self._result_cache = list(self._iterable_class(self))
2116  File 
"/home/travis/virtualenv/python3.5.6/lib/python3.5/site-packages/django/db/models/sql/compiler.py",
 line 1042, in apply_converters
2117    value = converter(value, expression, connection)
2118  File 
"/home/travis/virtualenv/python3.5.6/lib/python3.5/site-packages/django/db/backends/sqlite3/operations.py",
 line 254, in converter
2119    return create_decimal(value).quantize(quantize_value, 
context=expression.output_field.context)
2120TypeError: argument must be int of float



The unit test involves adding numpy.nan (among other things) to the database 
(in a models.DecimalField field) and at some point later in the test we are 
querying that data and when it try's to evaluate the query set the above error 
occurs.


The following code in sqlite/operations.py was changed from 2.0 to 2.1 which 
seems to be the source of the error.

FROM Django 2.0

    def convert_decimalfield_value(self, value, expression, connection):
        if value is not None:
            value = expression.output_field.format_number(value)
            # Value is not converted to Decimal here as it will be converted
            # later in BaseExpression.convert_value().
        return value



FROM Django 2.1

    def get_decimalfield_converter(self, expression):
        # SQLite stores only 15 significant digits. Digits coming from
        # float inaccuracy must be removed.
        create_decimal = decimal.Context(prec=15).create_decimal_from_float
        if isinstance(expression, Col):
            quantize_value = 
decimal.Decimal(1).scaleb(-expression.output_field.decimal_places)

            def converter(value, expression, connection):
                if value is not None:
                    return create_decimal(value).quantize(quantize_value, 
context=expression.output_field.context)
        else:
            def converter(value, expression, connection):
                if value is not None:
                    return create_decimal(value)
        return converter



Has anyone faced this issue....not sure what other details to provide...happy 
to provide more upon request.

Python 3.5.9 (default, Nov 24 2019, 01:35:13)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import sqlite3

In [2]: sqlite3.version
Out[2]: '2.6.0'

In [3]: sqlite3.sqlite_version
Out[3]: '3.22.0'


Django==2.1.15
mysqlclient==1.3.9

NumPy==1.11.1
pandas==0.19.2


-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/68734337-fa09-4ea1-8834-e1a76ea734bb%40googlegroups.com.

Reply via email to