在 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