Django(DRF)でサクッとAPIを作ってみよう
はじめに
本記事は、Django REST frameworkを使用して、簡単なCRUD APIを作成していきます。
DRFとは?
Django上に構築されるAPIを素早く構築するための拡張ライブラリ。
導入方法
前提として、Djangoプロジェクトが作成されていること。
インストール
pip install djangorestframework
settings.pyの編集
settings.pyのINSTALLED_APPSに"rest_framework"
を追加する。
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
...
"rest_framework",
]
Modelの作成とマイグレーション
今回は、社員モデルを作成します。
from django.db import models
class Employee(models.Model):
employee_id = models.AutoField(primary_key=True)
employee_name = models.CharField(max_length=20)
position_code = models.CharField(max_length=2, null=True, blank=True)
マイグレーションファイルを作成するために下記コマンドを実行します。
python manage.py makemigrations
下記ファイルが作成されていることを確認する。
# Generated by Django 4.2.9 on 2024-10-25 21:04
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="Employee",
fields=[
("employee_id", models.AutoField(primary_key=True, serialize=False)),
("employee_name", models.CharField(max_length=20)),
(
"position_code",
models.CharField(blank=True, max_length=2, null=True),
),
],
)
]
次に、マイグレーションを実行し、テーブルを作成する。
python manage.py migrate
ここまで正常に実行できたら、該当のDBにemployeeテーブルが作成されていることを確認する。
Serializerクラスの作成
Serializerとは?
Serializerは、データ変換とバリデーションの2つの機能があります。
ModelインスタンスをJSONへ直感的に変換できたり、クライアントからのリクエストをPythonオブジェクトとして扱うことを容易にします。
また、リクエストとして受け取ったデータを、定義した制約に従って検証し、失敗した場合は、どのフィールドでエラーが起こったかを示すメッセージを返す仕組みが整っています。
単純な型チェックだけでなく、独自ロジックによる複雑なチェックも可能。
Serializerの作成
今回は、ModelSerializerクラスを使用します。
Metaクラスのmodelでどのモデルを参照するかを指定し、fields(またはexclude)で、シリアライズするフィールドを定義します。
from rest_framework import serializers
from app.models import Employee
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = (
"employee_id",
"employee_name",
"position_code",
)
Viewクラスの作成
Viewとは?
主に「HTTP リクエストを受け取り、データを処理し、レスポンスを返す」という役割を担います。
Viewの作成
今回は、ViewSetを使用して最小限のViewを作成します。
ViewSetは、1つのクラスでCRUD全部を定義しURLのルーティングも最小限のコードでまとめて設定できます。
後述するurls.py側でDefaultRouterを使えば、一覧取得・詳細取得・新規作成・更新・削除等のエンドポイントが自動で設定されます。
from rest_framework import viewsets
from app.models import Employee
from app.serializers import EmployeeSerializer
class EmployeeViewSet(viewsets.ModelViewSet):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
ルーティング設定
アプリ内のurls.pyとプロジェクト内のurls.pyの両方に各処理を追加します。
DefaultRouter は、ViewSetが持つメソッド(list, retrieve, create, update, partial_update, destroy)に対応するURLルーティングを自動生成してくれます。
from app.views import EmployeeViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("employee", EmployeeViewSet)
api/
で始まるURLをapp/urls.py
に振り分けるための設定
from django.urls import path, include
urlpatterns = [
path('api/', include('app.urls')),
]
動作確認
ここまでできたら、APIの完成です。
起動していない場合は、下記コマンドを実行しましょう。
python manage.py runserver
DRFでは、ブラウザ上で直接APIを確認・テストできるHTMLベースのインタラクティブなインターフェースを提供しています。
ブラウザ上でAPIのURLにアクセスすると、下記のように表示できます。
ここから各メソッドの実行を行うことが可能です。
終わりに
ここまでご覧いただきありがとうございます。
本記事で出した例は非常に簡易的なコードなので、本来はもう少し複雑になるかと思います。
少しでもDjangoを触るきっかけになればと思います。
Discussion