🌐

(備忘録)Djangoの初期構築まとめ

に公開

前提

  • django_config:Djangoアプリ名
    • プロジェクト全体の設定を管理するDjangoのプロジェクト名
  • webapp:作成アプリ名
    • 実際の機能(Webページなど)を提供する個別のアプリ
  • {func}:使用する関数名
    • ビュー関数などの関数名をすべて {func} として統一(例:def {func}(request))

環境構築

a. venvを使う場合

プロジェクト内にvenvで仮想環境を作成してDjangoをインストール

ターミナル
mkdir django-project && cd django-project
python -m venv venv
source venv/bin/activate
pip install django

b. Dockerを使う場合

appディレクトリ、Dockerfile、compose.ymlを同プロジェクト内に作成

ターミナル
mkdir django-project && cd django-project
mkdir app && touch Dockerfile docker-compose.yml

※以下はあくまで一例

Dockerfile
FROM python:3.11-slim

WORKDIR /app
RUN pip install --upgrade pip\
    && pip install django
docker-compose.yml
version: "3.8"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: python-django-dev
    volumes:
      - ./app:/app
    working_dir: /app
    tty: true
    stdin_open: true
    ports:
      - "8000:8000"

コンテナをビルドして、bashに入る

ターミナル
docker-compose up -d --build
docker exec -it python-django-dev bash

c. DevContainerを使う場合

https://zenn.dev/secondselection/articles/how_to_devcontainer
手順bに記載のファイルに加えて、devcontainerディレクトリ、ファイルを作成

ターミナル
mkdir .devcontainer && touch .devcontainer/devcontainer.json
.devcontainer/devcontainer.json
{
  "name": "python-django-dev",
  "dockerComposeFile": "../docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/app",
  "settings": {
    "terminal.integrated.defaultProfile.linux": "bash",
    "python.formatting.provider": "black",
    "editor.formatOnSave": true
  },
  "remoteUser": "root",
  "extensions": ["ms-python.python", "ms-python.black-formatter"]
}

vscodeの左下にある><をクリックして、リモートウィンドウの起動オプションから「Reopen in Container」を選択

Djangoアプリ作成

1. プロジェクト作成

カレントディレクトリにDjangoプロジェクトを作成

ターミナル
django-admin startproject django_config .

※末尾に.(ドット)をつけることで、現在のディレクトリにファイルを展開

2. setting.pyを修正

ALLOWED_HOSTSを開発用に変更

django_config/settings.py
ALLOWED_HOSTS = ["*"]

3. サーバー起動

開発用のサーバーを起動

ターミナル
python manage.py runserver

※dockerのコンテナ内で起動する場合は下記コマンドを使用

ターミナル
python manage.py runserver 0.0.0.0:8000

→ 0.0.0.0 にしておくことで外部(ホスト)からのアクセスも許可される

webアプリ作成

1. アプリ作成

webappという名前でアプリ(機能単位のサブモジュール)を作成

ターミナル
python manage.py startapp webapp

2. Djangoアプリのurls.pyに追加

全体のルーティング設定(プロジェクトルート側)に、webappアプリのURL設定を追加

django_config/urls.py
from django.urls import path, include

urlpatterns = [
    path("webapp/", include("webapp.urls")), # ここにアプリを追加
]

3. setting.pyを修正

INSTALLED_APPSに作成したアプリ名を追加

django_config/settings.py
INSTALLED_APPS = [
    "webapp.apps.WebappConfig", #既存のものに追加
]

4. webapp/views.pyを修正

※以下動作確認
一例として、HttpResponseを使いテキストをそのまま返す簡易的なビューを作成

webapp/views.py
from django.http import HttpResponse

def {func}(request):
    return HttpResponse("表示させたい内容")

5. webapp/urls.pyを作成

アプリごとのルーティングファイルを新規作成

ターミナル
touch webapp/urls.py
webapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("{func}/", views.{func}, name="{func}"),
]

DBモデル作成

1. モデル定義

models.pyでデータベースのテーブル構造を定義

webapp/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

2. マイグレーション

モデルの変更をデータベースに反映

ターミナル
python manage.py makemigrations
python manage.py migrate

3. admin設定

管理画面からモデルを操作できるように設定

webapp/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)

管理者アカウントを作成

ターミナル
python manage.py createsuperuser

REST APIの構築(ViewSet + Router)

1. Django REST Frameworkのインストール

ターミナル
pip install djangorestframework

2. settings.pyの設定

config/settings.py
INSTALLED_APPS = [
    "rest_framework",
]

3. シリアライザの作成

ターミナル
touch webapp/serializers.py
webapp/serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"

4. webapp/views.py

webapp/views.py
# 既存のコードに追加
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

5. URLルーティングの設定

webapp/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views

# 既存のurls.pyのコードを拡張
router = DefaultRouter()
router.register("posts", views.PostViewSet)

urlpatterns = [
    path("{func}/", views.{func}, name="{func}"),  # 既存のルート
    path('api/', include(router.urls)),  # API用ルート
]

Discussion