在 Django 中建立 JSON 響應

Vaibhav Vaibhav 2023年1月30日 2021年6月29日
  1. 使用 Django 的內建類 JsonResponse 建立 JSON 響應
  2. QuerySet 轉換為 Python 字典並建立 JSON 響應
  3. 使用 Django 的內建類 HttpResponse 建立 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 字典。

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub