📚

# 2.3 Django REST Framework(DRF)入門

に公開

Django REST Framework(DRF)入門

前回の記事では Django の モデルベース開発 について紹介した。
今回はその続きとして、モデルを API に展開するための仕組み である Django REST Framework(DRF) を取り上げる。


DRF とは何か

Django は標準で HTML レンダリングが中心のフレームワーク。
一方で モダンな業務システムでは「API サーバ」としての役割 が求められることが多い。

DRF はそのためのライブラリで、以下の機能を提供する。

  • Serializer
    モデルやクエリセットを JSON に変換(逆に入力をバリデーションしてモデルに変換)

  • ViewSet
    一般的な CRUD(一覧・取得・作成・更新・削除)処理を簡単に実装できる仕組み

  • Router
    ViewSet を URL に自動で割り当てる仕組み

これらを組み合わせることで、モデルを基点にした API をすぐに作れる。


コード例:受注モデルを API 化する

モデル(前回と同じ)

# models.py
from django.db import models

class Order(models.Model):
    customer_name = models.CharField(max_length=100)
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.customer_name} ({self.total_amount}円)"

Serializer の定義

# serializers.py
from rest_framework import serializers
from .models import Order

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ["id", "customer_name", "total_amount", "created_at"]

Serializer を使うことで、Order モデルを JSON ⇔ Python オブジェクト に変換できる。


ViewSet の定義

# views.py
from rest_framework import viewsets
from .models import Order
from .serializers import OrderSerializer

class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

ModelViewSet を使うことで、標準的な CRUD 操作がすべて揃う。


Router に登録

# urls.py
from rest_framework.routers import DefaultRouter
from .views import OrderViewSet

router = DefaultRouter()
router.register(r"orders", OrderViewSet)

urlpatterns = router.urls

これで以下の API が自動的に生成される。

  • GET /orders/ (一覧取得)
  • POST /orders/ (新規作成)
  • GET /orders/{id}/ (詳細取得)
  • PUT /orders/{id}/ (更新)
  • DELETE /orders/{id}/ (削除)

実際のレスポンス例

一覧取得(GET /orders/

[
  {
    "id": 1,
    "customer_name": "株式会社テスト",
    "total_amount": "50000.00",
    "created_at": "2024-04-01T10:00:00Z"
  },
  {
    "id": 2,
    "customer_name": "サンプル商事",
    "total_amount": "120000.00",
    "created_at": "2024-04-02T15:30:00Z"
  }
]

新規作成(POST /orders/

送信する JSON:

{
  "customer_name": "新規取引先",
  "total_amount": "75000.00"
}

レスポンス:

{
  "id": 3,
  "customer_name": "新規取引先",
  "total_amount": "75000.00",
  "created_at": "2024-04-03T12:45:00Z"
}

DRF を使うメリット

  • モデルベース開発と相性が良い
    モデルを定義して Serializer に渡すだけで API ができる

  • 開発スピードが速い
    CRUD API がほぼ自動で生成される

  • 拡張性が高い
    独自のビジネスロジックや認証を追加しやすい

  • 統一感のある API
    Router を使うことで URL 設計が自然に揃う


まとめ

Django REST Framework を使えば、Django のモデルを そのまま API 化 できる。

  • モデルを中心に設計
  • Serializer でデータを JSON 化
  • ViewSet で CRUD を自動化
  • Router で URL に割り当て

これにより、Django は「サーバサイドレンダリングのフレームワーク」から「強力な API サーバ」に進化する。

次の記事では、この DRF をベースにした API 設計の工夫(バージョン管理・エラーハンドリングなど) を紹介する予定。

Discussion