DRF勉強(vol.1) バックエンドプロジェクト作成

## はじめに

DRF(Django REST framework)の勉強のため、以下書籍を参考にサンプル作成します。  
最終的には書籍にあるVue+DRFの作成を目指します。

1. 現場で使えるDjangoの教科書
2. 現場で使えるDjango REST Frameworkの教科書

Vol.1ではバックエンドプロジェクトの作成まで行います。

### 環境

- Intel Mac 13.4.1(c)
- Python 3.11.4
- Django 4.2.3
- DRF 3.14.0

### 前提

- pyenvがインストールされていること
- poetryがインストールされていること

## poetryの準備

### poetryの設定

poetryが作成する仮想環境をプロジェクト直下にするため、以下を実行します。

```sh
# poetryの最新化
$ poetry self update

# 変更内容の確認
$ poetry config --list
--- 省略 ---
virtualenvs.create = true
virtualenvs.in-project = true   ← `true`になっていることを確認
--- 省略 ---

# `true`になっていない場合は、以下を実行
$ poetry config virtualenvs.in-project true
```


### poetryのセットアップ

poetryのセットアップをデフォルト値で行います。  
なお、プロジェクトフォルダの名称には`-`など一部の文字は利用でないので注意が必要です。

```sh
# プロジェクトフォルダ作成
$ mkdir -p vue_drf/backend
$ cd vue_drf/backend

# Pythonのバージョン指定
$ pyenv local 3.11.4

# poetryのセットアップ
$ poetry init -n
$ poetry install --no-root
```

### venvの自動有効化

`direnv`を使って仮想環境が自動で有効化/無効化するように設定します。

```sh
$ echo 'source .venv/bin/activate' > .envrc
$ direnv allow
```

### パッケージの追加

必要となるパッケージを追加します。
なお、開発のみで利用するパッケージは`-G dev`を指定して追加します。

```sh
# パッケージの追加
$ poetry add Django djangorestframework

# 開発用パッケージの追加
$ poetry add -G dev debugpy pytest black ruff mypy
```


<details>
<summary>この時点のpyproject.toml</summary>

```toml
[tool.poetry]
name = "backend"
version = "0.1.0"
description = ""
authors = ["Jozuo <jozuo.dev@gmail.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"
django = "^4.2.3"
djangorestframework = "^3.14.0"


[tool.poetry.group.dev.dependencies]
debugpy = "^1.6.7"
pytest = "^7.4.0"
black = "^23.7.0"
ruff = "^0.0.280"
mypy = "^1.4.1"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```
</details>


## Djangoアプリケーションの作成

以下のディレクトリ構成になるようにDjangoのプロジェクトを作成します。

```tree
vue_drf/
└── backend
    ├── apiv1/          ... API用ディレクトリ
    ├── config/         ... 設定用ディレクトリ
    ├── shop/           ... Djangoモデル用ディレクトリ
    ├── manage.py*
    └── pyproject.toml

```

### アプリケーションの作成

```sh
# 設定ディレクトリの作成
$ django-admin startproject config .

# API用ディレクトリの作成
$ ./manage.py startapp apiv1

# Djangoモデル用ディレクトリ作成
$ ./manage.py startapp shop
```

<details>
<summary>この時点のファイル一覧</summary>

```tree
vue_drf/
└── backend/
    ├── apiv1/
    │   ├── migrations/
    │   │   └── __init__.py
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── config/
    │   ├── __pycache__/
    │   │   ├── __init__.cpython-311.pyc
    │   │   └── settings.cpython-311.pyc
    │   ├── __init__.py
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── shop/
    │   ├── migrations/
    │   │   └── __init__.py
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py*
    ├── poetry.lock
    └── pyproject.toml
```
</details>

## 設定追加・変更

Djangoの設定ファイル(`config/settings.py`)に以下の変更を行います。

### ロケール、タイムゾーンの変更

```diff:config/settings.py
  --- 省略 ---
  # Internationalization
  # https://docs.djangoproject.com/en/4.2/topics/i18n/
  
- LANGUAGE_CODE = "en-us"
+ LANGUAGE_CODE = "ja"
  
- TIME_ZONE = "UTC"
+ TIME_ZONE = "Asia/Tokyo"
  
  USE_I18N = True
  
  USE_TZ = True
  --- 省略 ---
```

### アプリケーションの追加

追加したパッケージ および 作成するアプリケーションを追加します。

```diff:config/settings.py
  --- 省略 ---
  # Application definition
  
  INSTALLED_APPS = [
      "django.contrib.admin",
      "django.contrib.auth",
      "django.contrib.contenttypes",
      "django.contrib.sessions",
      "django.contrib.messages",
      "django.contrib.staticfiles",
+     # 3rd party package
+     "rest_framework",
+     # application
+     "apiv1.apps.Apiv1Config",
+     "shop.apps.ShopConfig",
  ]
  --- 省略 ---
```