【问题标题】:Django REST Framework how to drop the unicode prefix in JSON response?Django REST Framework 如何在 JSON 响应中删除 unicode 前缀?
【发布时间】:2015-12-08 10:34:37
【问题描述】:

这是我的模型:

class Question(models.Model):
    options = models.TextField()

这是序列化程序:

class QuestionSerializer(ModelSerializer):
    class Meta:
        model = Question

这里是视图:

class QuestionView(ListAPIView):
    queryset = Question.objects.all()
    renderer_classes = (JSONRenderer,) 
    serializer_class = QuestionSerializer

在数据库内部,一条可用记录如下所示:

id  options
1   [u'opt1', u'opt2']

当请求 api 时,这里是返回的 JSON:

{
  "id": 1,
  "options": "[u'opt1', u'opt2']"
}

我的问题是如何以 JSON 格式保存字符串并以不带 unicode 前缀的 JSON 格式检索它? (我需要支持unicode字符,所以不能简单地将用户提交的数据转成字符串)


更新:这是我目前找到的一种解决方案。使用django-jsonfield 定义您的字段:

from jsonfield import JSONField

class Question(models.Model)
    options = JSONField()

然后,定义一个自定义序列化器字段:

from rest_framework import serializers

class JsonField(serializers.Field):
    def to_representation(self, value):
        return value

    def to_internal_value(self, data):
        return data

在序列化程序中使用此字段:

class QuestionSerializer(ModelSerializer):
    options = JsonField()

    class Meta:
        model = Question

现在,如果您尝试存储然后从数据库中检索记录,您应该得到一个没有 unicode 前缀的 JSON 格式的字符串。

由于 django-jsonfield 正在寻找维护者 ATM,以防万一它过时了,这里是我正在使用的版本:

  • Django 1.8.7
  • django-jsonfield 1.0.3
  • PostgresSQL 9.4.0.1

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

以 UTF-8 编码 unicode 字符串。 unicode 前缀将消失,字符串仍将支持 unicode 字符:

>>> msg = u"Hello"

>>> msg = msg.encode("utf-8")

>>> msg

'Hello'

由于您需要转换字典中的所有值,因此您可能需要编写一个函数来执行此操作。但是这里已经处理好了:How to get string objects instead of Unicode ones from JSON in Python?

【讨论】:

  • 这是一个与 django-rest-framework 相关的问题。 renderer_classes = (JSONRenderer,) 应该执行您对 IMO 的建议。但我不确定为什么它不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多