🌊

Django REST frameworkでREST APIを5分で構築

2022/04/02に公開

0.動作環境

Apple M1
macOS Monterey(ver12.2)
Python 3.9.7
Django 4.0.3
DjangoRESTframework 3.13.1

1.プロジェクトとアプリケーションの作成

requirements.txtをプロジェクト直下に作成し、DjangoとDjango REST framworkを定義します。

requirements.txt
Django
djangorestframework

Python仮想環境を構築・有効化して、requirements.txtに定義したパッケージを一括インストールします。
Djangoプロジェクトを作成し、REST APIの本体となるアプリケーションapiv1を作成します。

$ python -m venv venv
$ . venv/bin/activate
(venv)$ pip install -r requirements.txt
(venv)$ django-admin startproject config .
(venv)$ python manage.py startapp apiv1

2.プロジェクト設定ファイルの修正

config/settings.pyに、Django REST frameworkとアプリケーションapiviを登録します。LANGUAGE_CODEとTIME_ZONEも国内仕様に変えておきましょう。

config/settinsg.py
INSTALLED_APPS = [
    ...略...
    'rest_framework',
    'apiv1.apps.Apiv1Config',
]

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

3.アプリケーションファイルの作成・修正

プロジェクト用ルーティングファイルconfig/urls.pyに、アプリケーション側のルーティングapiv1/urlsを登録します。

config/urls.py
......
from django.urls import path,include
# include追記

urlpatterns = [
    ......
    path('api/v1/',include('apiv1.urls'))
]

モデルを通してデータベースをPythonオブジェクトとして扱います。
モデルファイルapiv1/models.pyにデータベースのテーブルとカラムを定義をします。今回は、ごく単純にtestname(文字列)とtestvalue(整数値)の2つのカラムを用意しました。

apiv1/models.py
......
class TestData(models.Model):
    testname = models.CharField(max_length=100)
    testvalue = models.IntegerField()

入力データはシリアライザでモデルオブジェクトに変換され、出力データはシリアライザを通じてJSON文字列に変換されます。
シリアライザーapiv1/serializers.pyを作成して、以下の通り記述します。

apiv1/serializers.py
from rest_framework import serializers
from .models import TestData 

class TestDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = TestData
        fields = '__all__'

ビューではJSON形式のデータが入ったリクエストオブジェクトを受け取り、JSON形式のレスポンスオブジェクトを作成します。
ビューapiv1/views.pyに以下の通り記述します。

apiv1/views.py
......
from rest_framework import viewsets
from .models import TestData
from .serializers import TestDataSerializer

class TestDataViewSet(viewsets.ModelViewSet):
    queryset = TestData.objects.all()
    serializer_class = TestDataSerializer

apiv1/urls.pyを作成して、ビューとURLを紐付けます。

apiv1/urls.py
from django.urls import path, include
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register('testdata',views.TestDataViewSet)

urlpatterns = [
    path('', include(router.urls))
]

4.データベースのマイグレーション

makemigrationsコマンドでマイグレーションファイルを作成します。
migrateコマンドで、デフォルトのデータベースSQLite3にマイグレーションファイルに基づくテーブルを作成します。

(venv)$ python manage.py makemigrations
(venv)$ python manage.py migrate


5.簡易サーバーの起動

簡易サーバーを起動し、http://127.0.0.1:8000/api/v1/を開くとREST APIが出力されます。

(venv)$ python manage.py runserver

Discussion