#13 Django/WebAPI PostgreSQL データベースからWebAPIをつくる

ここで作ったDjangoのアプリをいじってpostgreSQLにつくったデータベースをAPI化して外部からアクセスできるようにする。

まず、DjangoのREST Frameworkをインストールしておく。

pip install djangorestframework

すでにアプリはある前提ですすめていきます。

画像1

まずsetting.pyから

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'hellow',
   'rest_framework',
]

INSTALLED_APPSにhellow(このアプリケーション自体)とさっき追加したrest_frameworkを追加します。ここには、このアプリケーション(Django)で有効にしておきたいアプリをすべて記入します。

次に、postgreSQLへ接続する情報を書きます。デフォではsqlite3です。

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'pandas_postgres',
       'USER': 'postgres',
       'PASSWORD': '※※',
       'HOST': 'localhost',
       'PORT': '5432',
   }
}

上記のように、自分のデータベース情報に書き換えます。ENGINEでpostgreSQLが指定されています。

次に、models.pyを編集するのですが、接続確認もかねて、一度manage.pyを実行します。この時、inspectdb(データベース調査)をします。

python manage.py inspectdb

すると、モデルに必要なテーブル、カラム情報が自動で抽出されます。

class Score(models.Model):
   s_id = models.BigIntegerField(primary_key=True)
   scorecode = models.OneToOneField('Users', models.DO_NOTHING, db_column='scorecode', blank=True, null=True)
   a = models.BigIntegerField(db_column='A', blank=True, null=True)  # Field name made lowercase.
   b = models.BigIntegerField(db_column='B', blank=True, null=True)  # Field name made lowercase.
   c = models.BigIntegerField(db_column='C', blank=True, null=True)  # Field name made lowercase.
   class Meta:
       managed = False
       db_table = 'score'

class Users(models.Model):
   id = models.BigIntegerField(primary_key=True)
   scorecode = models.BigIntegerField(unique=True, blank=True, null=True)
   name = models.TextField(blank=True, null=True)
   email = models.TextField(blank=True, null=True)
   gender = models.TextField(blank=True, null=True)
   age = models.BigIntegerField(blank=True, null=True)
   class Meta:
       managed = False
       db_table = 'users'

これをそのままmodels.pyに入れます。(とりあえず)

from django.db import models

class Score(models.Model):
   s_id = models.BigIntegerField(primary_key=True)
   scorecode = models.OneToOneField('Users', models.DO_NOTHING, db_column='scorecode', blank=True, null=True)
   a = models.BigIntegerField(db_column='A', blank=True, null=True)  # Field name made lowercase.
   b = models.BigIntegerField(db_column='B', blank=True, null=True)  # Field name made lowercase.
   c = models.BigIntegerField(db_column='C', blank=True, null=True)  # Field name made lowercase.
   class Meta:
       managed = False
       db_table = 'score'

class Users(models.Model):
   id = models.BigIntegerField(primary_key=True)
  scorecode = models.BigIntegerField(unique=True, blank=True, null=True)
   name = models.TextField(blank=True, null=True)
   email = models.TextField(blank=True, null=True)
   gender = models.TextField(blank=True, null=True)
   age = models.BigIntegerField(blank=True, null=True)
   class Meta:
       managed = False
       db_table = 'users'

ここで外部キーなど必要に応じて変更します。

つぎにマイグレーションファイルを作ります。これは、データベースを作るにあたっての設計図のようなものです。

python manage.py makemigrations hellow

python manage.py migrate

ファイルを作りそれを反映させるようなイメージ。(たぶん)

つぎにSerializerをつくります。これは、たぶん出来上がったインスタンスをJson形式(辞書)に変換しています。

from rest_framework import serializers
from hellow.models import Users, Score

class usersSerializer(serializers.ModelSerializer):
   class Meta:
       model = Users
       fields = '__all__'
class scoreSerializer(serializers.ModelSerializer):
   class Meta:
       model = Score
       fields = '__all__'

です。これでusersSerializerとscoreSerializerクラスができました。

つぎにこれを吐き出すAPIのをつくります。

from rest_framework import viewsets, routers
from hellow.models import Score
from hellow.serializers import scoreSerializer

class scoreViewSet(viewsets.ModelViewSet):
   queryset = Score.objects.all()
   serializer_class = scoreSerializer

router = routers.DefaultRouter()
router.register(r'score', scoreViewSet)

です。

たぶん))queryset = Score.objects.all()でScoreのデータをAPIにセットしてます。ModelViewSetはそのための、実装コマンドです。((たぶん

下2行がルーティングに関する記述です。さっきつくった scoreViewSetを/scoreに入れるって意味です。

from django.conf.urls import url, include
from django.contrib import admin
from hellow import apis
urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^api/', include(apis.router.urls)),
]

apis.router.urlsを/apiに入れ込みます。

これで、

http://localhost:8000/api/score/

にデータが入りました。

python manage.py runserverを実行後、

上記URLにアクセスすると、APIができていることが分かります。

いいなと思ったら応援しよう!