迹忆客 专注技术分享

当前位置:主页 > 学无止境 >

在 Django 中创建 JSON 响应

作者:迹忆客 最近更新:2023/02/27 浏览次数:

在使用 API 或一般情况下,我们有时必须以 JSON(JavaScript Object Notation)的形式将数据从服务器发送到客户端。尤其是对于 API,JSON 是一种强制形式,用于发送或检索数据。

在 Django 中,使用 JSON 响应相对容易。实际上,我们可以通过两种方式创建 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 序列化程序。本教程将只讨论自定义函数,因为序列化程序本身就是一个很大的话题。

如果需要,你可以在此处了解序列化程序。

为了便于解释,我们将考虑一个简单的 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

我们还可以使用 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 字典。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 中的第一类函数

发布时间:2023/04/25 浏览次数:113 分类:Python

第一类函数是被语言视为对象或变量的函数。 我们可以将它们分配给变量或将它们作为对象传递给其他函数。Python 支持第一类函数的功能。

Python 函数参数类型

发布时间:2023/04/25 浏览次数:140 分类:Python

在这篇 Python 文章中,我们将学习 Python 中使用的函数参数类型。 我们还将学习如何编写不带参数的 Python 函数。

Python 生成器中的 send 函数

发布时间:2023/04/25 浏览次数:111 分类:Python

本教程将介绍如何在 Python 中使用生成器的 send() 函数。我们可以创建一个像迭代器一样运行的函数,并且可以通过 Python 生成器函数在 for 循环中使用。

Python Functools 偏函数

发布时间:2023/04/25 浏览次数:80 分类:Python

本文介绍了我们如何使用分部函数,该函数随 functools 库一起提供,并附有示例。 这显示了调用时如何传递属性和部分函数。

Python main() 函数中的参数

发布时间:2023/04/25 浏览次数:157 分类:Python

在本教程结束时,我们应该了解Python 中在 main() 中使用参数是否是一种好的做法。

Python 中的内置 identity 函数

发布时间:2023/04/25 浏览次数:88 分类:Python

identity 函数只是一个返回其参数的函数。 当我们定义一个恒等函数并赋值时,它会返回该值。在本教程结束时,我们将了解 Python 是否具有内置的 identity 函数。

在 Python 中拟合阶跃函数

发布时间:2023/04/25 浏览次数:177 分类:Python

阶跃函数是带有看起来像一系列步骤的图形的方法。 它们由一系列中间有间隔的水平线段组成,也可以称为阶梯函数。本文给出了阶跃函数的简单演示。

在 Python 中创建双向链表

发布时间:2023/04/25 浏览次数:54 分类:Python

双向链表是指由称为节点的顺序链接的记录集组成的链接数据结构。 每个节点包含一个前一个指针、一个下一个指针和一个数据字段。

将 Python 类对象序列化为 JSON

发布时间:2023/04/25 浏览次数:152 分类:Python

本教程介绍序列化过程。 它还说明了我们如何使用 toJSON() 方法使 JSON 类可序列化,并包装 JSON 以转储到其类中。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便