JSONField: Infinity, -Inifinity, NaN are not compatible with Postgres' JSON field · Issue #5235 · encode/django-rest-framework (original) (raw)

Performing system checks...

System check identified no issues (0 silenced).
June 26, 2017 - 17:31:55
Django version 1.11.2, using settings 'tutorial.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Internal Server Error: /snippets/
Traceback (most recent call last):
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
psycopg2.DataError: invalid input syntax for type json
LINE 1: ...nt("Hello world!")', false, 'python', 'friendly', '{"foo2": ...
                                                             ^
DETAIL:  Token "Infinity" is invalid.
CONTEXT:  JSON data, line 1: {"foo2": Infinity...


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/steve/devel/examples/drf/tutorial/snippets/views.py", line 23, in snippet_list
    serializer.save()
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/rest_framework/serializers.py", line 215, in save
    self.instance = self.create(validated_data)
  File "/home/steve/devel/examples/drf/tutorial/snippets/serializers.py", line 18, in create
    return Snippet.objects.create(**validated_data)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/query.py", line 394, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/base.py", line 806, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/base.py", line 836, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/base.py", line 922, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/base.py", line 961, in _do_insert
    using=using, raw=raw)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/query.py", line 1063, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1099, in execute_sql
    cursor.execute(sql, params)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/backends/utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/home/steve/.virtualenvs/drf_example/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
django.db.utils.DataError: invalid input syntax for type json
LINE 1: ...nt("Hello world!")', false, 'python', 'friendly', '{"foo2": ...
                                                             ^
DETAIL:  Token "Infinity" is invalid.
CONTEXT:  JSON data, line 1: {"foo2": Infinity...

[26/Jun/2017 17:32:10] "POST /snippets/ HTTP/1.1" 500 180159

commit b9c6cc6e44ca1a83fa6d88c1f06af073fa7052a7 Author: Stephen Chisholm sbchisholm@gmail.com Date: Mon Jun 26 14:51:43 2017 -0300

Add JSONField to model

diff --git a/snippets/migrations/0002_snippet_json_field.py b/snippets/migrations/0002_snippet_json_field.py new file mode 100644 index 0000000..a53e958 --- /dev/null +++ b/snippets/migrations/0002_snippet_json_field.py @@ -0,0 +1,21 @@ +# -- coding: utf-8 -- +# Generated by Django 1.11.2 on 2017-06-26 17:49 +from future import unicode_literals + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): +

diff --git a/snippets/models.py b/snippets/models.py index d443dc6..7772fab 100644 --- a/snippets/models.py +++ b/snippets/models.py @@ -1,6 +1,7 @@ from django.db import models from pygments.lexers import get_all_lexers from pygments.styles import get_all_styles +from django.contrib.postgres.fields import JSONField

LEXERS = [item for item in get_all_lexers() if item[1]] LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) @@ -14,6 +15,7 @@ class Snippet(models.Model): linenos = models.BooleanField(default=False) language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

diff --git a/snippets/serializers.py b/snippets/serializers.py index 7f12e7c..2a45475 100644 --- a/snippets/serializers.py +++ b/snippets/serializers.py @@ -9,6 +9,7 @@ class SnippetSerializer(serializers.Serializer): linenos = serializers.BooleanField(required=False) language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python') style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')