【问题标题】:Override JSONSerializer on django rest framework在 django rest 框架上覆盖 JSONSerializer
【发布时间】:2013-12-23 20:11:05
【问题描述】:

我正在尝试在我的 django rest 框架上应用此修复程序 Adding root element to json response (django-rest-framework)

但我不确定如何覆盖 django rest 框架上的 json 序列化程序,任何帮助都会很棒。

最终结果将是在 Json 上具有根节点名称,因为现在它只是一个没有根名称的对象数组,即

不是这样的

[{"foo":"bar"}]

我需要它是这样的

{"元素": [{"foo":"bar"}]}

让它与 Ember JS 一起工作

谢谢

【问题讨论】:

  • 你能简单解释一下你需要做什么..
  • 嘿@mariodev 我编辑了问题以便更好地解释
  • 标题应该是“override JSONRenderer”而不是“override JSONSerializer”

标签: python django django-rest-framework


【解决方案1】:

我想你已经在你给出的帖子中找到了答案。

您需要定义自定义 JSON 渲染器

from rest_framework.renderers import JSONRenderer

class EmberJSONRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):
        data = {'element': data}
        return super(EmberJSONRenderer, self).render(data, accepted_media_type, renderer_context)

并将其用作 default renderer 在设置中或作为您查看的明确定义的渲染,例如:

class MyView(APIView):
    renderer_classes = (EmberJSONRenderer, )
    # ...

【讨论】:

  • 感谢您的回复,我唯一的问题是我不能 100% 确定在哪里添加自定义代码,以及如何正确导入它,我应该将它添加到任何文件然后添加视图的导入?
  • @user1713940 这取决于您的项目结构,您可以创建额外的 utils 应用程序并在那里创建 renderers.py 并从那里导入您的自定义渲染器。
  • 您有什么想法可以根据服务更改名称元素吗? (例如,对于名为 ../foo/ 的服务,您的数据将是 data = {'foo':data} 但对于名为 ../bar/ 的其他服务,您的数据将被定义为 data = {'bar':data} )
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 2017-09-23
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多