かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

Django model の データを JSON化して利用する。 2018/07/26

かえるるる(@kaeru_nantoka)です。

 

本エントリでは、前回記事で書いたAPIを叩くときの検索ワードとして、データベースに登録したものを使用できるようになることを目指します。

 

本記事では前記事でも扱ったproject, app に加えて

song というアプリを同じプロジェクト内に作成して進めることとします。

 

project : myTutorial

app : myTutorial/api

         myTutorial/song


kaeru-nantoka.hatenablog.com

・目次

 1:準備

 2:実践

3:おまけ

4:参考にした記事

 

1:準備

まず、今回扱うモデルとデータは以下の通りです。

# song/models.py

from django.db import models

class Song(models.Model):
    song_name = models.CharField(max_length=50)

    def __str__(self):
        return self.song_name

    # Djangoモデル のデータを返す関数
    def to_dict(self):
        return self.song_name

DBにはadmin画面から入れておきます。
今回は、 

Lemon (米津玄師) ultrasoul(B'z)

の2曲を入れています。


次に、取得したデータをウェブ上に表示する準備をします。

#api/urls.py

from django.urls import path
from api import views

app_name = 'api'
urlpatterns = [

    path('hoge/bring_mdl_data/', views.bring_mdl_data, name='bring_mdl_data')
]
#myTutorial/urls.py

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

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


2:実践

#api/views.py 

import json
from django.http import HttpResponse
import requests

from song.models import Song

#pythonでJSONファイルを返す時に記述

def render_json_response(request, data, status=None):
    #response を JSON で返却
    json_str = json.dumps(data, ensure_ascii=False, indent=2)
    callback = request.GET.get('callback')
    if not callback:
        callback = request.POST.get('callback')  # POSTでJSONPの場合
    if callback:
        json_str = "%s(%s)" % (callback, json_str)
        response = HttpResponse(json_str, content_type='application/javascript; charset=UTF-8', status=status)
    else:
        response = HttpResponse(json_str, content_type='application/json; charset=UTF-8', status=status)
    return response

def bring_mdl_data(request, song_name=None):

    #クエリセットという形式で登録されている曲を全て持ってくる
    items = Song.objects.all() 

    k = json.dumps([ items[0].to_dict() ])
    # items[0] に格納されている Lemon がJSON形式に変換されて k に代入される

    return render_json_response(request, k)
    # JSON形式の k をウェブ上に表示する。 

127.0.0.1:8000/song/hoge/bring_mdl_data/

に "[\"Lemon\"]"

が表れたら成功です!!


3:おまけ

こうしてDjango model よりWebページ上に引っ張ってきたデータは
フロントのJSで fetch( ' 127.0.0.1:8000/song/hoge/bring_mdl_data/ ' )
でアクセスできます!
(ちなみに console.log( 返り値 ) で Lemon が表示されます。)


4:参考記事

↓こちらの方の記事を参考にしました。ありがとうございました!

DjangoでJSONを使うための一考察 SQLの最適化など - グロブ


以上です!