#13 Django/WebAPI PostgreSQL データベースからWebAPIをつくる
ここで作ったDjangoのアプリをいじってpostgreSQLにつくったデータベースをAPI化して外部からアクセスできるようにする。
まず、DjangoのREST Frameworkをインストールしておく。
pip install djangorestframework
すでにアプリはある前提ですすめていきます。
まず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ができていることが分かります。