Django REST Framework如何在JSON响应中删除unicode前缀?

时间:2015-12-08 10:34:37

标签: django django-rest-framework

这是我的模特:

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格式保存字符串并以JSON格式检索它而不使用unicode前缀? (我需要支持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

1 个答案:

答案 0 :(得分:1)

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

>>> msg = u"Hello"

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

>>> msg

'Hello'

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