Django 在REST Framework中如何返回自定义JSON

Django 在REST Framework中如何返回自定义JSON

Django Rest framework是用于在Django中构建API的工具包。它提供了处理Python中的HTTP请求和响应的功能。Django Rest framework使用Serializers和Response类返回自定义JSON数据。在本文中,我们将探讨在Django REST Framework中返回自定义JSON的不同方法,并提供示例。

Serializers和Response类

Django Rest Framework(DRF)使用序列化程序将复杂的数据类型(例如Django模型)转换为可以轻松呈现为HTTP响应的JSON、XML或其他内容类型。要返回自定义JSON数据,您可以创建一个序列化程序类,并使用DRF的Response类创建自定义响应。

语法

  • 序列化程序
serializers.FieldType()

在这里,在序列化器类的内部,我们使用所需的字段类型(例如CharField、IntegerField等)定义字段,并将它们分配给相应的字段名。

  • 响应类
Response(data, status=status.HTTP_200_OK)

在这里,我们从rest_framework.response模块导入Response类,从rest_framework模块导入status模块。通过将我们要返回的数据和期望的HTTP状态码(例如HTTP_200_OK)传递给Response类的构造函数,我们创建一个响应对象。

示例

在下面的示例中,我们有一个名为Book的模型,包含标题、作者和价格等字段。我们定义了一个名为BookSerializer的序列化器类,将Book模型的字段映射到序列化器字段。在BookView类的get方法中,我们使用示例书籍数据创建一个序列化器的实例。然后,我们验证序列化器数据,并使用serializer.data检索序列化数据。最后,我们使用Response类和HTTP 200状态码返回序列化数据。

from rest_framework import serializers, status
from rest_framework.response import Response
from rest_framework.views import APIView

class BookSerializer(serializers.Serializer):
    title = serializers.CharField()
    author = serializers.CharField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)

class BookView(APIView):
    def get(self, request):
        books_data = [
            {'title': 'Book 1', 'author': 'Author 1', 'price': 9.99},
            {'title': 'Book 2', 'author': 'Author 2', 'price': 14.99},
            {'title': 'Book 3', 'author': 'Author 3', 'price': 19.99}
        ]
        serializer = BookSerializer(data=book_data)
        serializer.is_valid(raise_exception=True)
        response_data = serializer.data

        return Response(response_data, status=status.HTTP_200_OK)

输出

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "title": "Book 1",
        "author": "Author 1",
        "price": "9.99"
    },
    {
        "title": "Book 2",
        "author": "Author 2",
        "price": "14.99"
    },
    {
        "title": "Book 3",
        "author": "Author 3",
        "price": "19.99"
    }
]

自定义响应格式

Django Rest Framework提供了一种使用 renderers 模块来自定义响应格式的方法。默认情况下,DRF使用JSONRenderer类将响应渲染为JSON格式。然而,我们可以定义自定义渲染器来修改响应结构或添加额外的信息。

示例

在下面的示例中,假设我们想在响应中添加元数据,例如书的总数。我们可以通过创建自定义渲染器并覆盖render方法来实现这一点。为此,我们创建一个自定义渲染器类 CustomRenderer ,通过继承JSONRenderer类来实现。在render方法内部,我们通过添加一个代表书籍总数的count字段和包含书籍数据的results字段来修改数据。然后,我们调用父render方法来获取包含修改数据的JSON响应。

from rest_framework import renderers

class CustomRenderer(renderers.JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        response_data = {'count': len(data), 'results': data}
        return super().render(response_data, accepted_media_type, renderer_context)

class BookView(APIView):
    renderer_classes = [CustomRenderer]

    def get(self, request):
        books = ['Book 1', 'Book 2', 'Book 3']
        return Response(books, status=status.HTTP_200_OK)

输出

{"count":3,"results":["Book 1","Book 2","Book 3"]}

使用响应装饰器

Django Rest Framework提供了装饰器来简化返回自定义响应的过程。@api_view装饰器允许您使用renderer_classes参数来指定所需的响应格式。

示例

在下面的示例中,我们定义了一个名为books的视图函数,并使用@api_view装饰器对其进行装饰,以指定它应该处理的只有GET请求。我们还使用@renderer_classes装饰器来指定响应应该使用我们的自定义渲染器CustomRenderer进行渲染。在函数内部,我们将书籍列表作为响应返回。

from rest_framework.decorators import api_view, renderer_classes

@api_view(['GET'])
@renderer_classes([CustomRenderer])
def books(request):
    books = ['Book 1', 'Book 2', 'Book 3']
    return Response(books, status=status.HTTP_200_OK)

输出

{"count":3,"results":["Book 1","Book 2","Book 3"]}

运行示例

要运行示例并查看输出,您需要使用已安装Django REST Framework的Django项目进行设置。以下是步骤:

  • 创建一个新的Django项目:
$ django-admin startproject bookstore
  • 在项目中创建一个新的Django应用:
$ cd bookstore
$ python manage.py startapp api
  • 配置Django项目和应用程序,通过修改settings.py文件。将以下行添加到INSTALLED_APPS和REST_FRAMEWORK部分:
INSTALLED_APPS = [
    ...
    'rest_framework',
    'api',
]

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'api.renderers.CustomRenderer',
    ]
}
  • 将上面示例中提到的视图和序列化程序定义在api应用程序目录下的views.py和serializers.py文件中

  • 更新项目目录中的urls.py文件,包含API端点:

from django.urls import path
from api.views import BookView

urlpatterns = [
    path('books/', BookView.as_view()),
]
  • 运行开发服务器
$ python manage.py runserver
  • 访问URL books ,在浏览器中您应该看到包含书籍列表的自定义JSON响应。

Django 在REST Framework中如何返回自定义JSON

结论

在这篇文章中,我们讨论了如何在Python Django框架的Django Rest Framework中返回自定义JSON。我们探讨了不同的方法,包括使用序列化器和响应类,使用渲染器自定义响应格式,以及利用装饰器进行响应定制。通过使用上述方法,我们可以相应地转换和格式化JSON响应。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程