基本構成の概要
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'))
動作確認
- サーバー起動:
python manage.py runserver - APIエンドポイントアクセス:
http://localhost:8000/api/v1/categories/ - Basic認証でログインし、POSTリクエストでデータ作成
- 管理画面(
/admin/)で権限設定を調整可能