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


Django Rest framework 是一個用於在 Django 中構建 API 的工具包。它提供處理 Python 中 HTTP 請求和響應的功能。Django Rest framework 使用序列化器和 Response 類來返回自定義 JSON 資料。在本文中,我們將探討在 Django REST Framework 中返回自定義 JSON 的不同方法,以及一些示例。

序列化器和 Response 類

Django Rest Framework(DRF) 使用序列化器將複雜的資料型別(例如 Django 模型)轉換為 JSON、XML 或其他可以輕鬆呈現為 HTTP 響應的內容型別。要返回自定義 JSON,您可以建立一個序列化器類,並使用 DRF 中的 Response 類來建立自定義響應。

語法

  • 序列化器

serializers.FieldType()

在這裡,在序列化器類內部,我們使用所需的欄位型別(例如,CharField、IntegerField 等)定義欄位,並將它們分配給相應的欄位名稱。

  • Response 類

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 提供了一種使用 **渲染器** 模組自定義響應格式的方法。預設情況下,DRF 使用 JSONRenderer 類以 JSON 格式呈現響應。但是,我們可以定義自定義渲染器來修改響應結構或新增其他資訊。

示例

在下面的示例中,假設我們想在響應中新增元資料,例如圖書的總數。我們可以透過建立自定義渲染器並覆蓋 render 方法來實現這一點。為此,我們透過子類化 JSONRenderer 類建立一個自定義渲染器類 **CustomRenderer**。在 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
  • 透過修改 settings.py 檔案配置 Django 專案和應用。將以下行新增到 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 中使用 Python Django 框架返回自定義 JSON。我們探討了實現此目標的不同方法,包括使用序列化器和 Response 類、使用渲染器自定義響應格式以及使用裝飾器進行響應自定義。透過使用上述方法,我們可以相應地轉換和格式化 JSON 響應。

更新於: 2023年7月18日

3K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告