在 Django 中创建 JSON 响应
在使用 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 字典。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串