django rest 更改 json 响应设计

Posted

技术标签:

【中文标题】django rest 更改 json 响应设计【英文标题】:django rest change json response design 【发布时间】:2016-12-21 17:41:03 【问题描述】:

我正在使用 Django 休息教程,我看到所有响应都只返回模型字段,例如:

[
  
    "id": 1,
    "title": "",
    "code": "foo = \"bar\"\n",
    "linenos": false,
    "language": "python",
    "style": "friendly"
  ]

我的问题是如何设计响应,例如:

  users:[
   
        "id": 1,
        "title": "",
        "code": "foo = \"bar\"\n",
        "linenos": false,
        "language": "python",
        "style": "friendly"
      ]

【问题讨论】:

我不明白问题是什么,你能更描述一下吗?提前致谢! 谢谢回复,是不是我的例子不好? 您发布的两个代码示例之间的唯一区别几乎相同。你的问题是什么,你想要的输出是什么,到目前为止你做了什么? :D 他想添加一个根元素。 ***.com/questions/14824807/… 正如我所写,我遵循 django rest 教程 (django-rest-framework.org/tutorial/2-requests-and-responses/…),我问我是否可以采用示例并为 json 对象添加它们的名称,就像在我的第二个示例中一样,我添加了“用户”这个词 【参考方案1】:

据我所知,您正在使用以下代码,我已对其进行了修改以执行您的要求。但是,我建议除非您有充分的理由这样做,否则不要修改给出响应的方式。这会导致将来为 ModelViewSets 创建多个对象时变得复杂,并且所有 list() 方法都会返回不同的值。

我真的不喜欢下面的内容,但它确实回答了这个问题。此外,您可以将序列化程序更改为嵌套序列化程序,但这本身就是另一个问题。

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


@api_view(['GET', 'POST'])
def snippet_list(request):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response('users': serializer.data)

    elif request.method == 'POST':
        # Assuming we have modified the below - we have to hack around it
        serializer = SnippetSerializer(data=request.data['users'])
        if serializer.is_valid():
            serializer.save()
            return Response('users': serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

上面应该给你下面的回应:


    "users": [
        
            "id": 1,
            "title": "",
            "code": "foo=\"bar\"\n",
            "linenos": false,
            "language": "python",
            "style": "friendly"
        ,
        
            "id": 2,
            "title": "",
            "code": "print\"hello, world\"\n",
            "linenos": false,
            "language": "python",
            "style": "friendly"
        
    ]

【讨论】:

感谢您的帮助!我如何在响应中组合两个没有任何关系的模型?例如“用户”和“地址” 这是相同的方法。将不同的 QuerySet 与不同的序列化程序一起使用,然后使用单独的键值并传入序列化程序数据。

以上是关于django rest 更改 json 响应设计的主要内容,如果未能解决你的问题,请参考以下文章

Django rest框架:如何全局更改错误响应格式

为啥从 django rest 框架返回的 JSON 在响应中有正斜杠?

django rest框架列表查询自定义json数组结果响应,因为日期格式

Django 将查询集序列化为 JSON 以仅使用字段信息和 id 构造 RESTful 响应

用于 Android 客户端的 Django Rest Framework 响应的通用 JSON 格式

序列化多个模型并在一个 json 响应中发送全部 django rest 框架