模型的__str__字段上带有Django Rest Framework的UnicodeDecodeError

时间:2018-08-27 20:10:09

标签: python django django-rest-framework python-unicode

关于这个错误,我正在敲桌子,对互联网进行了搜索,但是1)找不到答案,或者2)不能完全了解发生了什么。

我的问题的tldr摘要:

  

当我将非ASCII字符(例如è)存储在models.TextField和   使用serializers.CharField进行序列化,我没有遇到   问题。但是,如果我在模型上有 str 方法,   返回相同的文本字段,序列化后,我得到以下内容   错误:

     

UnicodeDecodeError:“ ascii”编解码器无法解码位置中的字节0xc3   5:序数不在范围内(128)

首先...

  • 我正在OS X上运行Python 2.7.10
  • 我正在使用Django==1.11.7djangorestframework==3.7.3
  • 我的LANGLC_ALL环境变量都设置为en_US.UTF-8
  • 最后,我正在使用PostgreSQL 9.5.6,并且验证了我的数据库是用UTF8编码的。

我的问题的详细信息:

我有一个简单的模型,如下所示。它具有一个name的{​​{1}}变量以及一个仅返回TextField的{​​{1}}方法。我还定义了一个__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

观察#1:

该错误似乎仅在我尝试序列化GET时发生。如果我从序列化程序中删除UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128) (因此,仅序列化程序__str____str__)也不会出现任何错误。奇怪的是,name返回的内容与testing-testing相同。

观察#2: 我验证了在__str__方法中,self.name的类型为__str__。 在self.name方法中,unicode的类型也为testing

观察#3: 完整的堆栈跟踪如下所示。

self.name

似乎是与json编码器有关的错误?

unicodeTraceback (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) 有更深了解的人是否知道发生了什么事?

1 个答案:

答案 0 :(得分:2)

虽然我不完全了解解决此错误的原因,但是将if (!this.subscription) { this.subscription = cartConnectorService.cartItemAdded$.subscribe( newCartItem => { console.log("in cartConnectorService.cartItemAdded$.subscribe"); this.saveCartWithNewItem(newCartItem); }); } 设置为UNICODE_JSON可以解决此错误。

False