Я бьюсь головой об стол об этой ошибке, и я искал в интернете, но либо 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
имеет представление о том, что происходит?