ジャンゴ(django)のモデル(Models)をJSONタイプでレスポンス(Response)する

2019-06-05

ジャンゴ(django)のプロジェクトでAPIを使って情報をやりとりする時、モデル(Models)から貰った情報(QuerySet)をそのままJSONでレスポンス(Response)する方法について説明します。

概要

ジャンゴ(django)でAPIサーバーを開発する時、モデル(Models)から直接持ってきた情報(QuerySet)をそのままJSONで返したい時があります。このブログポストではジャンゴ(django)を使ってモデル(Models)から持ってきた情報(QuerySet)をそのままJSONタイプで返す方法について説明します。

このブログで紹介するソースコードはGithubに公開されております。下記のリンクで確認してください。

ジャンゴ(django)のプロジェクトの準備

以前のブログシリーズでジャンゴ(django)のプロジェクトを使う方法について説明しました。ジャンゴ(django)を使ってプロジェクトを構成する方法について詳しく内容は下記のリンクを確認してください。

このブログではジャンゴ(django)のインストールやプロジェクトの設定などについては説明しません。簡単にプロジェクトが進めるレベルで説明します。

下記のコマンドでジャンゴ(django)のプロジェクトを生成します。

django-admin startproject django_response_model_to_json

下記のブログを参考してデーターベース連動やテーブルを作ります。

データーベースの連動が終わったら下記のコマンドで管理者(superuser)を作ります。

python manage.py createsuperuser

下記のブログを参考してBlogジャンゴ(django)のアプリとPostモデル(Model)を生成します。

そして下記のブログを参考してテストデーターを追加します。

URL作成

テストデーターを持てくるためのURLを生成します。下記のリンクにURLを作る方法について詳しく説明がありますので参考してください。

URLを作成するためdjango_response_model_to_json/urls.pyを開いて下記のように修正します。

from django.contrib import admin
from django.urls import path
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

そしてBlogアプリにURLを追加するためblog/urls.pyを生成して下記のように修正します。

from django.urls import path
from . import views

urlpatterns = [
    path('posts/', views.posts, name='posts'),
]

ビュー(View)作成

モデル(Models)から持てきたデーター(QuerySet)をJSONタイプに変換するためビュー(View)を作成します。ジャンゴ(django)のビュー(View)に関しては下記のブログを参考してください。

ビュー(View)を作るためblog/views.pyを開いて下記のように修正します。

from django.shortcuts import render
from django.core import serializers
from django.http import HttpResponse
from .models import Post


def posts(request):
    posts = Post.objects.filter(published_at__isnull=False).order_by('-published_at')
    post_list = serializers.serialize('json', posts)
    return HttpResponse(post_list, content_type="text/json-comment-filtered")
  • from django.core import serializers: モデル(Models)をJSONタイプでデーターを直列化捨ためserializersを読んできます。
  • from django.http import HttpResponse: JSONでデーターをレスポンス(Response)するためHttpResponseを使う予定です。
  • posts = Post.objects.filter(published_at__isnull=False).order_by('-published_at'): Postモデル(Models)を使ってデーターを持てきます。
  • post_list = serializers.serialize('json', posts): 持てきたデーター(QuerySet)をJSONタイプの文字列で変換します。
  • return HttpResponse(post_list, content_type="text/json-comment-filtered"): post_listがJSONタイプの文字列なので(")を消してJSONをレスポンスします。

確認

今まで作った内容を確認するためジャンゴ(django)のテストサーバーを実行します。

python manage.py runserver

そしてPostmanで当該URL(http://localhost:8000/posts/)をGETで読んだら下記のようにデーターをちゃんと持ってくることが確認できます。

ジャンゴ(django)のモデル(Models)をJSONでレスポンス - Postmanを使ってデーター確認

Buy me a coffeeBuy me a coffee
Posts