【问题标题】:Django rest framework is returning 'u prefix to angular from the databaseDjango rest 框架正在从数据库中返回 'u 前缀到 angular
【发布时间】:2015-07-14 08:02:47
【问题描述】:

我正在使用 Django Rest Framework 和 Angularjs 创建一个站点,该站点获取发型师的信息并将其保存到数据库中。还有另一个页面从数据库中提取该信息并将其显示在个人资料页面上。

我遇到的问题是,当我调用该数据时,它会返回 unicode 前缀 'u,而 javascript 不会让我使用它。

这是我回来的:

{"stylist":"{u'email': u'chris@internet.com', u'profession': {u'esthetician': True, u'hair_stylist': True}, u'name': u'Chris', u'certification': u'no'}","created_at":"2015-05-04T19:27:19.482058Z","updated_at":"2015-05-04T19:27:19.511937Z"}

我的模特:

class StylistSubmission(models.Model):
    stylist = models.CharField(max_length=2500, null=True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.stylist

我的 serializers.py:

class StylistSerializer(serializers.ModelSerializer):
    class Meta:
        model = StylistSubmission
        fields = (
            'stylist',
            'created_at',
            'updated_at'
        )
        read_only_fields = ('created_at', 'updated_at')

我的意见.py:

class StylistViewSet(viewsets.ModelViewSet):
    queryset = StylistSubmission.objects.order_by('-created_at')
    serializer_class = StylistSerializer

    def perform_create(self, serializer):
        instance = serializer.save()
        post_save.send(sender=self.__class__, stylist=instance.stylist)
        return super(StylistViewSet, self).perform_create(serializer)

几天来,我一直在用头撞墙,试图弄清楚这一点。我是 django rest 框架的新手,对 angular 非常陌生,所以我可能会遗漏一些明显的东西。任何帮助将不胜感激。

【问题讨论】:

  • 问题不在于u,而是出于某种原因你有一个Python字典而不是JSON。 (还要注意单引号)。
  • 知道我如何无法找回 python 字典吗?

标签: javascript python django angularjs django-rest-framework


【解决方案1】:

考虑到预期的关注点分离,我建议让 perform_create 函数专注于“保存”模型。

create() 函数(来自 CreateModelMixin 父级)是负责生成 HTTP 响应的函数,因此这将是呈现和发出响应的更好地方,对吧?

    from rest_framework.renderers import JSONRenderer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)

        return Response(JSONRenderer.render({'stylist': serializer.data}), status=status.HTTP_201_CREATED, headers=headers)

PS:通常 RESTful 端点只会发出 Stylist 对象,而不是将其包装在另一个键('stylist')中。由于它是对创建 POST 的响应,因此暗示返回的对象将是 Stylist 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2014-10-16
    • 1970-01-01
    • 2018-06-30
    • 2016-04-29
    • 2021-08-06
    • 2021-06-07
    相关资源
    最近更新 更多