UnicodeDecodeError с Django Rest Framework в поле __str__ модели - PullRequest
0 голосов
/ 27 августа 2018

Я бьюсь головой об стол об этой ошибке, и я искал в интернете, но либо 1) не смог найти ответ, либо 2) недостаточно осведомлен, чтобы понять, что происходит.

Краткое описание моей проблемы:

Когда я сохраняю не-ASCII символ (например, è) в моделях. TextField и сериализовать его с сериализаторами. CharField, я не сталкиваюсь и проблемы. Однако, если у меня есть метод str на модели, которая возвращает то же текстовое поле, после сериализации я получаю следующее Ошибка:

UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xc3 в позиции 5: порядковый номер вне диапазона (128)

Прежде всего ...

  • Я работаю Python 2.7.10 на OS X.
  • Я использую Django==1.11.7 и djangorestframework==3.7.3.
  • My LANG и LC_ALL установлены на en_US.UTF-8.
  • Наконец, я использую PostgreSQL 9.5.6, и я проверил, что моя база данных закодирована в UTF8.

Подробности моей проблемы:

У меня есть простая модель, как показано ниже. Он имеет переменную name, которая является TextField, а также метод __str__, который просто возвращает self.name. Я также определил переменную testing, которая также просто возвращает self.name в демонстрационных целях.

from __future__ import unicode_literals

from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _


@python_2_unicode_compatible
class Supplier(models.Model):
    name = models.TextField(help_text=_('Store Name'))

    class Meta:
        verbose_name = 'Supplier'
        verbose_name_plural = 'Suppliers'

    def testing(self):
        return self.name

    def __str__(self):
        return self.name

Далее мой сериализатор определяется следующим образом.

class SupplierSerializer(serializers.ModelSerializer):

    class Meta:
        model = Supplier
        fields = ('name', 'testing', '__str__')

Наконец, у меня есть следующий набор:

class SupplierViewSet(viewsets.ModelViewSet):
    queryset = Supplier.objects.all()
    serializer_class = SupplierSerializer

Проблема:

Когда я делаю GET запрос к представлению, я получаю следующую ошибку:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)

Наблюдение № 1:

Эта ошибка возникает только при попытке сериализации __str__. Если я удаляю __str__ из сериализатора (и, следовательно, только сериализатор name и testing), я не получаю никаких ошибок. Странно, что testing возвращает ту же самую вещь, что и __str__ - self.name.

Наблюдение № 2: Я убедился, что в методе __str__ self.name имеет тип unicode. Внутри метода testing, self.name также имеет тип unicode.

Наблюдение № 3: Полная трассировка стека приведена ниже.

Traceback (most recent call last):
  File "/Users//github///lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users//github///lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/Users//github///lib/python2.7/site-packages/django/core/handlers/base.py", line 217, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users//github///lib/python2.7/site-packages/django/core/handlers/base.py", line 215, in _get_response
    response = response.render()
  File "/Users//github///lib/python2.7/site-packages/django/template/response.py", line 107, in render
    self.content = self.rendered_content
  File "/Users//github///lib/python2.7/site-packages/rest_framework/response.py", line 72, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/Users//github///lib/python2.7/site-packages/rest_framework/renderers.py", line 105, in render
    allow_nan=not self.strict, separators=separators
  File "/Users//github///lib/python2.7/site-packages/rest_framework/utils/json.py", line 28, in dumps
    return json.dumps(*args, **kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 250, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 210, in encode
    return ''.join(chunks)

Кажется, это ошибка, связанная с кодировщиком json?

Кто-нибудь с более глубоким пониманием django и unicode имеет представление о том, что происходит?

1 Ответ

0 голосов
/ 31 августа 2018

Хотя я не совсем понимаю причину, по которой это исправляет ошибку, установка UNICODE_JSON в значение False исправляет ошибку.

REST_FRAMEWORK = {
    'UNICODE_JSON': False,
}
...