🫡

Django(DRF)でサクッとAPIを作ってみよう

2024/12/28に公開

はじめに

本記事は、Django REST frameworkを使用して、簡単なCRUD APIを作成していきます。

DRFとは?

Django上に構築されるAPIを素早く構築するための拡張ライブラリ。

導入方法

前提として、Djangoプロジェクトが作成されていること。

インストール

pip install djangorestframework

settings.pyの編集

settings.pyのINSTALLED_APPS"rest_framework"を追加する。

settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    ...
    "rest_framework",
]

Modelの作成とマイグレーション

今回は、社員モデルを作成します。

employee.py
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

下記ファイルが作成されていることを確認する。

migrations/0001_initial.py
# 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)で、シリアライズするフィールドを定義します。

serializers.py
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を使えば、一覧取得・詳細取得・新規作成・更新・削除等のエンドポイントが自動で設定されます。

views.py
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ルーティングを自動生成してくれます。

app/urls.py
from app.views import EmployeeViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register("employee", EmployeeViewSet)

api/で始まるURLをapp/urls.pyに振り分けるための設定

project/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