【问题标题】:UnicodeDecodeError with Django Rest Framework on Model's __str__ field模型的 __str__ 字段上带有 Django Rest Framework 的 UnicodeDecodeError
【发布时间】:2018-08-27 20:10:09
【问题描述】:

关于这个错误,我一直在敲我的头,我已经搜索了互联网,但要么 1) 无法找到答案,要么 2) 没有足够的知识来弄清楚发生了什么。

我的问题的 tldr 总结:

当我在 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 变量,它是一个TextField 以及一个简单地返回self.name__str__ 方法。我还定义了一个 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__(因此只有序列化程序nametesting)我不会收到任何错误。奇怪的是testing 返回的结果与__str__ - self.name 完全相同。

观察 #2: 我验证了在__str__ 方法中,self.nameunicode 类型。 在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编码器的错误?

有对djangounicode有更深入了解的人知道发生了什么吗?

【问题讨论】:

  • 除此之外,您应该考虑升级到 Python 3。
  • 你为什么要在你的序列化器上放置 both name__str__ 的字段?这没有意义。我认为我们需要在这里看到更多的原始上下文。方法需要使用SerializerMethodField
  • @wim 目前我的 str 方法只是返回 self.name 为简单起见。 str 方法实际上返回了其他数据——我只是为了简单起见没有显示它。但是关于你的第二点 - 这是一个很好的观点......我养成了将模型字段放在 Meta.fields 元组中的习惯,但你提出了一个很好的观点,即 str 在技术上不是一个字段.但这是一种方法吗?我觉得这是一种“特殊”的方法。

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


【解决方案1】:

虽然我不完全理解修复错误的原因,但将 UNICODE_JSON 设置设置为 False 可以修复错误。

REST_FRAMEWORK = {
    'UNICODE_JSON': False,
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多