DjangoでモデルからREST APIを素早く構築する手法

基本構成の概要

DjangoとDjango REST Frameworkを組み合わせると、モデル定義から標準的なREST APIを迅速に実装できます。主な特徴は以下の通りです。

  • 標準的なRESTインターフェースを提供(一覧/詳細のGET、新規作成のPOST、更新のPUT、削除のDELETE)
  • 基本認証をデフォルトの認証メカニズムとして採用
  • 管理画面で権限設定を柔軟に調整可能

実装手順

環境準備

pip install django
pip install djangorestframework

プロジェクト作成

django-admin startproject product_api
cd product_api
python manage.py startapp inventory

設定ファイルの編集

product_api/settings.pyに追加:
INSTALLED_APPS = [
    ...
    'inventory',
    'rest_framework',
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissions',
    ]
}

モデル定義

inventory/models.py
from django.db import models

class ProductCategory(models.Model):
    title = models.CharField(max_length=150, db_index=True)
    url_identifier = models.SlugField(unique=True, max_length=150)

class ProductItem(models.Model):
    category = models.ForeignKey(
        ProductCategory,
        on_delete=models.CASCADE,
        related_name='items'
    )
    item_name = models.CharField(max_length=200)
    url_slug = models.SlugField(max_length=200)
    description = models.TextField(blank=True)
    unit_price = models.DecimalField(max_digits=10, decimal_places=2)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class OrderRecord(models.Model):
    customer_name = models.CharField(max_length=50)
    contact_number = models.CharField(max_length=30)
    delivery_address = models.TextField()
    city = models.CharField(max_length=80)
    payment_status = models.BooleanField(default=False)
    order_date = models.DateTimeField(auto_now_add=True)

データベースの作成

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

シリアライザの実装

inventory/api/serializers.py
from rest_framework import serializers
from .models import ProductCategory, ProductItem, OrderRecord

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductCategory
        fields = ['id', 'title', 'url_identifier']

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductItem
        fields = ['id', 'item_name', 'url_slug', 'unit_price', 'is_active']

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = OrderRecord
        fields = ['id', 'customer_name', 'contact_number', 'payment_status']

ビューの作成

inventory/api/views.py
from rest_framework import generics
from .models import ProductCategory, ProductItem, OrderRecord
from .serializers import CategorySerializer, ProductSerializer, OrderSerializer

class CategoryEndpoint(generics.ListCreateAPIView):
    queryset = ProductCategory.objects.all()
    serializer_class = CategorySerializer

class ProductEndpoint(generics.ListCreateAPIView):
    queryset = ProductItem.objects.all()
    serializer_class = ProductSerializer

class OrderEndpoint(generics.ListCreateAPIView):
    queryset = OrderRecord.objects.all()
    serializer_class = OrderSerializer

URLの設定

inventory/api/urls.py
from django.urls import path
from .views import CategoryEndpoint, ProductEndpoint, OrderEndpoint

urlpatterns = [
    path('categories/', CategoryEndpoint.as_view(), name='category-list'),
    path('products/', ProductEndpoint.as_view(), name='product-list'),
    path('orders/', OrderEndpoint.as_view(), name='order-list'),
]
product_api/urls.pyに追加:
path('api/v1/', include('inventory.api.urls', namespace='inventory-api'))

動作確認

  1. サーバー起動: python manage.py runserver
  2. APIエンドポイントアクセス: http://localhost:8000/api/v1/categories/
  3. Basic認証でログインし、POSTリクエストでデータ作成
  4. 管理画面(/admin/)で権限設定を調整可能

タグ: Django REST Framework model-serializer API-views basic-authentication

7月22日 18:50 投稿