Djangoのお勉強メモ

Djangoについて触る機会があったので、メモとして残しておきます。

# Djangoって何？
webアプリケーションを作成するのに便利なコンポーネントをまとめたフレームワークです。
Pythonで作成されています。
詳しいことや使い方は以下のドキュメントが役立ちます。

Django ドキュメント
https://docs.djangoproject.com/ja/

Django Girls のチュートリアル
https://tutorial.djangogirls.org/ja/

# Djangoを使うまでの準備
上記のドキュメントに従い、まずは動かしてみます。
今回の環境は以下の通りです。
OS: Windows 10
エディタ: Visual Studio Code 1.51.1

## Pythonのインストールと仮想環境のセットアップ
以下を参考に、Pythonのインストールをします。
https://www.python.jp/install/windows/index.html
※この時の最新は3.9.0でした。

次にPythonを実行する仮想環境を作ります。
VSCodeでフォルダを開き、ターミナルから以下のコマンドを実行します。

```shell
python -m venv .venv
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
.venv\Scripts\Activate.ps1
```

`-m`は「モジュールを指定して実行する」という意味です。
venvモジュールを実行して、".venv"フォルダに実行環境を作成します。
2つ目の`Set-ExecutionPolicy`はPowerShellの場合に必要とのこと。
Activate.ps1ファイルを実行して仮想環境を起動します。

## Djangoのインストール
仮想環境ができたら、Djangoをインストールするためターミナルから以下のコマンドを実行します。
※ついでにpipの最新化もしておきます。

```shell
python -m pip install --upgrade pip
python -m pip install Django
```

※この時はDjango 3.1.3が最新でした。

## VSCodeの拡張機能のインストール
後でデバッグができるように、VSCodeにPythonの拡張機能をインストールします。

# Djangoプロジェクトを作る
以下のコマンドでプロジェクトを作成します。manage.pyなど、必要なファイルが自動生成されます。

```shell
django-admin startproject Otameshi_prj
```

manage.pyをVSCodeで開き、左のメニューアイコンから実行→「launch.jsonファイルを作成します」→Django→左上の三角ボタン(デバッグの開始)の順にクリックします。
ターミナルに以下のように表示されたら成功です。

```
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```

http://127.0.0.1:8000/ にブラウザでアクセスすると、Djangoのページが見えるようになっています。

# Djangoアプリケーションを作る
以下のコマンドを実行して、アプリケーションを作成します。ここでも必要なファイルが自動生成されます。

```shell
python manage.py startapp Otameshi_app
```

プロジェクトのurls.pyに、作成したアプリケーションのURLを追加します。

```diff:Otameshi_prj/urls.py
 from django.contrib import admin
-from django.urls import path
+from django.urls import include, path
 
 urlpatterns = [
+    path('Otameshi_app/', include('Otameshi_app.urls')),
     path('admin/', admin.site.urls),
 ]
```

アプリケーションのフォルダにurls.pyを追加し、indexを設定します。

```diff:Otameshi_app/urls.py
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+    path('', views.index, name='index'),
+]
```

indexの処理の内容はアプリケーションのviews.pyにメソッドとして定義します。
ここでは"Hello, world."を出力します。

```diff:Otameshi_app/views.py
 from django.shortcuts import render
+from django.http import HttpResponse
 
 # Create your views here.
+
+
+def index(request):
+    return HttpResponse("Hello, world.")
```

ここまでできたら、またデバッグ実行して、 http://127.0.0.1:8000/Otameshi_app にブラウザでアクセスすると、"Hello, world."と書かれたwebページが表示されます。

# Modelの作成

データベースの元となるデータをModelといいます。
ここではCommandという名前で、テキストを保持するデータを作ってみます。

```diff:Otameshi_app/models.py
 from django.db import models
 
 # Create your models here.
+
+class Command(models.Model):
+    cmd = models.TextField()
```

ソースコードの変更を行ったら、マイグレーションを行って環境に変更を反映します。

```shell
python manage.py makemigrations Otameshi_app
python manage.py migrate
```

# アプリケーションの登録と管理者の作成

一通りアプリケーションが動くことが確認できたので、アプリケーションの登録を行います。

```diff:Otameshi_prj/settings.py
 INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'Otameshi_app',
 ]
```

```diff:Otameshi_app/admin.py
 from django.contrib import admin
+from .models import Command
 
 # Register your models here.
+
+admin.site.register(Command)
```

ここで、管理者設定を行っておきます。以下のコマンドで管理者を登録します。管理者名、メールアドレス、パスワードの入力を要求されるので、適当に入力します。

```shell
python manage.py createsuperuser
```

ここまでできたら、再度デバッグ実行して、 http://127.0.0.1:8000/admin にアクセスします。先ほど設定した管理者名とパスワードを入力すると、アプリケーションと"Command"のAPIが表示されています。

# Django REST Frameworkを使う

以下のコマンドでDjango REST Frameworkをインストールします。

```shell
pip install djangorestframework
```

インストールしたら、プロジェクトで使用可能なように設定を行います。

```diff:Otameshi_prj/settings.py
 INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'api',
+    'rest_framework',
 ]
```

データの受け渡しを行うために必要なSerializerを作成します。
対象は先ほど作成した`Command`で、すべての項目をシリアライズするように設定しておきます。
(といっても現状ではテキスト1項目だけですけど。)

```diff:Otameshi_app/serializer.py
+from rest_framework import serializers
+from .models import Command
+
+class CommandSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Command
+        fields = '__all__'
```

Serializerを作成したら、それを使って表示を行う`CommandViewSet`を作成します。

```diff:Otameshi_app/views.py
 from django.shortcuts import render
 from django.http import HttpResponse
+from rest_framework import viewsets
+from .models import Command
+from .serializer import CommandSerializer
 
 # Create your views here.
 
 def index(request):
     return HttpResponse("Hello, world.")
+
+class CommandViewSet(viewsets.ModelViewSet):
+    queryset = Command.objects.all()
+    serializer_class = CommandSerializer
```

http://127.0.0.1:8000/api/command/ で表示できるように、URL設定をしておきます。Django REST Frameworkに用意されている`router`を使用して、URLと`CommandViewSet`を対応付けます。

```diff:Otameshi_prj/urls.py
 from django.contrib import admin
 from django.urls import include, path
+from Otameshi_app.urls import router 
 
 urlpatterns = [
-    path('Otameshi_app/', include('Otameshi_app.urls')),
+    path('Otameshi_app/', include(router.urls)),
     path('admin/', admin.site.urls),
 ]
```

```diff:Otameshi_app/urls.py
 from django.urls import path
+from rest_framework import routers
 
 from . import views
 
+router = routers.DefaultRouter()
+router.register('command', views.CommandViewSet)
+
 urlpatterns = [
     path('', views.index, name='index'),
 ]
```

これで再度デバッグを実行し http://127.0.0.1:8000/api/command/ にアクセスすると、登録したデータの一覧が表示されます。
とはいえ、最初は何も表示されていないので、POSTをするとデータが追加されていくことがわかるかと思います。
※不要になったデータは http://127.0.0.1:8000/admin の管理者画面から削除することができます。