在 Django 中创建 JSON 响应
- 
          
            使用 Django 的内置类 JsonResponse创建 JSON 响应
- 
          
            将 QuerySet转换为 Python 字典并创建 JSON 响应
- 
          
            使用 Django 的内置类 HttpResponse创建 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 字典。
