Django で JSON 応答を作成する

Vaibhav Vaibhav 2023年1月30日
  1. Django のビルド内クラス JsonResponse を使用して JSON 応答を作成する
  2. QuerySet を Python 辞書に変換し、JSON 応答を作成する
  3. Django のビルド内クラス HttpResponse を使用して JSON 応答を作成する
Django で 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_typeapplication/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
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.

関連記事 - Django JSON