0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Django REST framework + MySQL のDocker環境構築

Posted at

以前、こちらの記事で 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.pyapiv1/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))
]

makemigrationmigrateを実施します。

python manage.py makemigrations
python manage.py migrate

http://127.0.0.1:8000/api/v1/を開くとREST API画面が表示されました。
スクリーンショット 2023-09-23 15.19.48.png

参考サイト

Django REST framework + PostgreSQL を Docker 内に構築
Django REST frameworkでREST APIを5分で構築
Django REST framework 公式ドキュメント

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?