HOWTO · Django

在 Django 中建立 JSON 響應

瞭解如何在 Django 中建立 JSON 響應。

本頁內容

在使用 API 或一般情況下,我們有時必須以 JSON(JavaScript Object Notation)的形式將資料從伺服器傳送到客戶端。尤其是對於 API,JSON 是一種強制形式,用於傳送或檢索資料。

在 Django 中,使用 JSON 響應相對容易。實際上,我們可以通過兩種方式建立 JSON 響應。

使用 Django 的內建類 JsonResponse 建立 JSON 響應

JsonResponse,顧名思義,用於建立 JSON 響應。此類的建構函式接受 Python 字典作為引數,並基於該字典建立 JSON 響應。

最簡單的例子如下。

from django.views import View
from django.http import JsonResponse

# Function based view


def myView(request):
    data = {
        "name": "Vaibhav",
        "age": 20,
        "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
    }

    return JsonResponse(data)


# Class based view
class MyView(View):
    def get(self, request):
        data = {
            "name": "Vaibhav",
            "age": 20,
            "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
        }

        return JsonResponse(data)

但並非所有的閃光都是金色的。處理 QuerySet 或任何 Django 模型時,JsonResponse 會引發錯誤。

QuerySet 不是 Python 字典。如果我們必須在 JSON 響應中傳送或共享 QuerySet 或 Django 模型,則必須將其轉換為 Python 字典。

現在,我們有兩種方法可以做到這一點。首先,建立一個接受 Django 模型或 QuerySet 陣列的函式,並將它們轉換為 Python 字典或 Python 字典陣列。第二種選擇是使用 Django 序列化程式。本教程將只討論自定義函式,因為序列化程式本身就是一個很大的話題。

如果需要,你可以在此處瞭解序列化程式。

將 QuerySet 轉換為 Python 字典並建立 JSON 響應

為了便於解釋,我們將考慮一個簡單的 Django 模型,並學習如何與 JSON 響應共享這樣的模型。

考慮以下模型。

from django.db import models
from django.contrib.auth.models import User


class Blog(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blogs")
    title = models.CharField(max_length=250)
    description = models.CharField(max_length=500)
    showcaseImage = models.ImageField(upload_to="Images/")
    dateTimeOfCreation = models.DateTimeField(auto_now=True)
    shareURL = models.URLField()
    likes = models.IntegerField()
    disLikes = models.IntegerField()
    bookmarks = models.IntegerField()

    def __str__(self):
        return self.title

如果我們必須將此模型轉換為 Python 字典並在 JSON 響應中傳送它,我們可以建立一個處理轉換的實用程式函式。然後在檢視中,我們可以建立一個字典併為轉換後的 Python 字典新增一個鍵值對,然後建立一個 JsonResponse。

參考以下程式碼。

from django.views import View
from django.http import JsonResponse
from . import models


def blogToDictionary(blog):
    """
    A utility function to convert object of type Blog to a Python Dictionary
    """
    output = {}
    output["title"] = blog.title
    output["description"] = blog.description
    output["showcaseImage"] = blog.showcaseImage.url
    output["dateTimeOfCreation"] = blog.dateTimeOfCreation.strftime(
        "%m/%d/%Y, %H:%M:%S"
    )
    output["shareURL"] = blog.shareURL
    output["likes"] = blog.likes
    output["disLikes"] = blog.disLikes
    output["bookmarks"] = blog.bookmarks

    return output


# Function based view
def myView(request):
    # Single Blog
    blog = models.Blog.objects.get(id=1)

    # Multiple Blogs
    blogs = models.Blog.objects.all()
    tempBlogs = []

    # Converting `QuerySet` to a Python Dictionary
    blog = blogToDictionary(blog)

    for i in range(len(blogs)):
        tempBlogs.append(
            blogToDictionary(blogs[i])
        )  # Converting `QuerySet` to a Python Dictionary

    blogs = tempBlogs

    data = {"blog": blog, "blogs": blogs}

    return JsonResponse(data)

在上面的程式碼中,我們建立了一個實用函式 blogToDictionary(),用於處理 Blog 型別的物件的轉換。此函式遍歷所有欄位,將它們儲存在字典中,最後返回字典。然後,在檢視中,我們轉換了獲取的物件並建立了一個 JsonResponse。

使用 Django 的內建類 HttpResponse 建立 JSON 響應

我們還可以使用 HttpResponse 建立一個 JSON 響應。程式幾乎相同。我們首先建立一個我們希望傳送的資料的字典。然後我們建立一個類 HttpResponse 物件。我們將 content_type 設定為 application/json,並使用 Python 的內建庫 json 將 Python 字典轉換為 JSON。最後,我們將轉換後的字典與 HttpResponse 一起傳送。

import json
from django.views import View
from django.http import JsonResponse

# Function based view


def myView(request):
    data = {
        "name": "Vaibhav",
        "age": 20,
        "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
    }

    return HttpResponse(json.dumps(data), content_type="application/json")


# Class based view
class MyView(View):
    def get(self, request):
        data = {
            "name": "Vaibhav",
            "age": 20,
            "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
        }

        return HttpResponse(json.dumps(data), content_type="application/json")

如上所述,在使用此方法傳送之前,QuerySet 或 Django 模型必須轉換為 Python 字典。