前提
Pythonの実行環境を構築した上で、Djangoをインストールしておきましょう。
「Windows」キー+「R」で出てきたウィンドウに「cmd」と入力→エンターして出てきたプロンプトで以下を実行。
pip install django
プロジェクトの立ち上げ→アプリ作成→アプリ側のurls.py作成
作業用のディレクトリを作り、その場所でコマンドを開きます。それから以下のコマンドを実行していきます。
1.プロジェクト立ち上げ
python -m django startproject project
※django-adminコマンドではありません。
2.ディレクトリを変更
cd project
3.アプリを作成
python manage.py startapp app
4./project/appディレクトリ内にurls.pyを作成(空ファイルでOK)
5./project/project/settings.py内のINSTALLED_APPSの部分に’app’を追加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app', #追記
]
Django Rest Frameworkをインストール→DjangoをRest Framework化する
DjangoをAPIサーバー化します。
1.Django Rest Frameworkをインストール
「Windows」キー+「R」で出てきたウィンドウに「cmd」と入力→エンターして出てきたプロンプトで以下を実行。
pip install djangorestframework
2.settings.pyのINSTALLED_APPSに追加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',
'rest_framework', #追加
]
デモアプリ作成その1
本のタイトルと本の著者名を返却するデモアプリを作成してみます。
DBのテーブルを定義(models.py)
/project/app/models.pyを編集してデータベースを定義します。
本のタイトルと著者名を格納するために、2つのテーブルを作ります。
・booksテーブル
カラム名 | id | title | author | created_at | updated_at |
説明 | 主キー・一意性を保つため | 本のタイトル | 本の著者(authorテーブルの外部キーを格納) | レコードの登録日 | レコードの更新日 |
データを必須とするか | 必須 | 必須 | 必須 | 必須 | 任意 |
・authorsテーブル
カラム名 | id | name | created_at | updated_at |
説明 | 主キー・一意性を保つため | 著者名 | レコードの登録日 | レコードの更新日 |
データを必須とするか | 必須 | 必須 | 必須 | 任意 |
上のような仕様に基づいてmodels.pyを定義します。
書く際の注意点として、モデルに外部キーを指定したい場合、参照先のテーブルの定義を先に記述する必要があります。ここではbooksテーブルのauthorカラムがauthorsテーブルの外部キーになっているので、authorsクラスをbooksクラスの前に記述します。(逆だとマイグレーション時にエラーが出ます。)
from django.db import models
class authors(models.Model):
id = models.AutoField(primary_key=True) #primary_key=Trueで主キーに指定
name = models.CharField(max_length=255) #max_length=255はおまじない
created_at = models.DateTimeField(auto_now_add=True) #おまじない
updated_at = models.DateTimeField(auto_now=True) #おまじない
#おまじないstart
class Meta:
verbose_name_plural = 'authors' #Djangoの管理サイトでのテーブルの表示名を設定(ここではauthor)
def __str__(self):
return self.name #Djangoの管理サイトのレコード一覧で表示するレコード名の設定(ここではname)
#おまじないend
class books(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=255)
author = models.ForeignKey(authors, on_delete=models.CASCADE) #外部キーのカラムとして指定(紐付け先クラス名,紐付け先が消されたときにどうするか)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name_plural = 'books'
def __str__(self):
return self.title
models.pyの編集が終わったら、マイグレーションとマイグレートをしてmodels.pyで定義したとおりにDBを自動構築してもらいます。
python manage.py makemigrations
python manage.py migrate
管理サイトでテーブルを管理できるようにする(admin.py)
/project/app/admin.pyを編集します。
from django.contrib import admin
from . models import *
admin.site.register(authors)
admin.site.register(books)
管理サイトを使えるようにする
スーパーユーザー(adminアカウント)をコマンドで作ります。
ユーザー名は「admin」、パスワードは「password」です。(実運用ではNG!)
python manage.py createsuperuser
Username (leave blank to use 'theguest'): admin
Email address:
Password:
Password (again):
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
管理サイトに入る
以下コマンドでサーバーを実行。
python manage.py runserver
起動したらブラウザのURLバーにて「localhost:8000」と入力するとトップページに(現時点ではデフォルトページが表示されます)、「localhost:8000/admin」と入力すると管理サイトへ行けます。ログイン画面が出るので、先ほど設定したユーザー名とパスワードを入力します。
作成したテーブルが表示されるかや、レコードの追加などをやってみてください。
ここまでは通常のDjangoアプリの作成と同様でした。
デモアプリ作成2
ここからいよいよREST APIの構築に入ります。
REST APIには以下の3要素が必ず必要です。順に作っていきます。
・Serializer – Modelをどのようにシリアライズ(・デシリアライズ)するかを決めるためのもの
・ViewSet – APIのクエリーをどう解釈するかを決めるためのもの
・URL pattern – DjangoにURLのパターンを教えるためのもの
引用:https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8
Serializerの定義(serializer.py)
/project/app/serializer.pyを新規作成して、以下のように記述します。
from rest_framework import serializers
from .models import *
class AuthorSerializer(serializers.ModelSerializer): #○○Serializerとい名前をつける
class Meta:
model = authors #models.pyのクラス名で指定
fields = [ #ここでAPIで返却したいカラムを指定する
'id',
'name',
]
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = books
fields = [
'id',
'title',
'author',
'created_at',
'updated_at',
]
ViewSetの定義(views.py)
/project/app/views.pyを編集します。
from django.shortcuts import render
from rest_framework import viewsets
from .serializer import *
class AuthorViewSet(viewsets.ModelViewSet): #○○ViewSetという名前を付ける
queryset = authors.objects.all() #models.pyのクラス名で指定
serializer_class = AuthorSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = books.objects.all()
serializer_class = BookSerializer
URL patternの定義(プロジェクトのurls.pyとアプリのurls.py)
プロジェクト側のurls.pyである/project/project/urls.pyを編集します。
from django.contrib import admin
from django.urls import path, include
from app.urls import router
urlpatterns = [
path(r'admin/', admin.site.urls),
path(r'api/', include(router.urls)),
]
次に、アプリ側のurls.pyである/project/app/urls.pyを編集します。
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import *
router = DefaultRouter()
router.register(r'author', AuthorViewSet)
router.register(r'book', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]
以上で完成です。
サーバーを実行し、「localhost:8000/api/」にアクセスすると、GUIでjsonデータを確認することができます。