以前、こちらの記事で Django + MySQLのDocker環境を構築しました。
この環境でDjango REST frameworkを使用するよう設定変更を行いました。
前提環境
PC: MacBook Air M2
OS: macOS Ventura Ver. 13.2.1
Homebrew: 4.0.9
Docker: 20.10.23
docker-compose: v2.15.1
コンテナ設定ファイル
docker-compose.yml
今回はdocker-compose.ymlは変更しません。
version: '3.9'
services:
db:
container_name: mysql
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_ROOT_USER -p$$MYSQL_ROOT_PASSWORD || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
volumes:
- db_data:/var/lib/mysql
django:
container_name: django
build: .
command: python manage.py runserver 0.0.0.0:8000
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_USER: ${MYSQL_ROOT_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
db:
condition: service_healthy
volumes:
db_data:
Dockerfile
Dockerfileも今回は変更しません。
FROM python:3.11.0
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY . /code/
requirements.txt
requirements.txtに「djangorestframework==3.14.0」の記述を追加し、
docker build時にdjanorestframeworkをinstallします。
Django==4.2
djangorestframework==3.14.0 #追加
mysqlclient==2.2.0
アプリケーションの追加と設定
コンテナのbuild & 起動
コンテナのbuild
docker-compose build
コンテナをバックグラウンドで起動
docker-compose up -d
アプリの追加
APIアプリケーションを追加します。
docker-compose exec django bash
python manage.py startapp apiv1
config/settings.py
に、Django REST frameworkとアプリケーションapiv1を登録します。
INSTALLED_APPS = [
...略...
'rest_framework',
'apiv1.apps.Apiv1Config',
]
こちらの記事の3以降を実施します。
config/urls.py
にapiv1/urls
を登録します。
from django.conf.urls.static import static
urlpatterns = [
...略...
path('api/v1/', include('apiv1.urls'))
]
apiv1/models.py
でモデルを定義します。
from django.db import models
class TestData(models.Model):
testname = models.CharField(max_length=100)
testvalue = models.IntegerField()
モデルオブジェクトとJSONの変換を行う apiv1/serializer.py
を作成します。
このファイルの詳細は公式ドキュメントに記載があります。
from rest_framework import serializers
from .models import TestData
class TestDataSerializer(serializers.ModelSerializer):
class Meta:
model = TestData
fields = '__all__'
apiv1/views.py
を作成します。
from rest_framework import viewsets
from .models import TestData
from .serializers import TestDataSerializer
class TestDataViewSet(viewsets.ModelViewSet):
queryset = TestData.objects.all()
serializer_class = TestDataSerializer
apiv1/urls.py
を作成します。
from django.urls import path, include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register('testdata', views.TestDataViewSet)
urlpatterns = [
path('', include(router.urls))
]
makemigration
と migrate
を実施します。
python manage.py makemigrations
python manage.py migrate
http://127.0.0.1:8000/api/v1/
を開くとREST API画面が表示されました。
参考サイト
Django REST framework + PostgreSQL を Docker 内に構築
Django REST frameworkでREST APIを5分で構築
Django REST framework 公式ドキュメント