Django で JSON 応答を作成する
-
Django のビルド内クラス
JsonResponse
を使用して JSON 応答を作成する -
QuerySet
を Python 辞書に変換し、JSON 応答を作成する -
Django のビルド内クラス
HttpResponse
を使用して JSON 応答を作成する
API を使用する場合、または一般的に、サーバーからクライアントに JSON(JavaScript Object Notation)の形式でデータを送信する必要がある場合があります。特に API の場合、JSON はデータを送信または取得するための必須のフォームです。
Django では、JSON レスポンスの操作は比較的簡単です。JSON 応答を作成する方法は実際には 2つあります。
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)
しかし、輝くものすべてが金であるわけではありません。JsonResponse
は、QuerySet
または任意の Django モデルを処理するときにエラーをスローします。
QuerySet
は Python 辞書ではありません。JSON レスポンスで QuerySet
または Django モデルを送信または共有する必要がある場合は、Python ディクショナリに変換する必要があります。
さて、これを行うには 2つの方法があります。まず、Django モデルまたは QuerySet
の配列を受け入れ、それらを Python 辞書または Python 辞書の配列に変換する関数を作成します。2 番目のオプションは、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)
上記のコードでは、タイプ Blog
のオブジェクトの変換を処理するユーティリティ関数 blogToDictionary()
を作成しました。この関数は、すべてのフィールドを反復処理してディクショナリに格納し、最後にディクショナリを返します。次に、ビュー内で、フェッチされたオブジェクトを変換し、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 ディクショナリに変換する必要があります。