Djangoの学習③（モデルの作成から有効化まで）

## Database の設定

データベースをセットアップして、最初のモデルを作成します

テストアプリなので、SQLite3を使用します

以下、DATABASE、タイムゾーン、インストールAPPはデフォルトのままにします
```python:mysite/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}



TIME_ZONE = 'UTC'



INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```

これらのアプリケーションは最低1つデータベースのテーブルを使うので、
使い始まる前にデータベースにテーブルを作る必要があります。

設定を確認したらディレクトリをひとつ上に上がって
必要なデータベースのテーブルを作成します

```
$ python manage.py migrate

Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
```

migrationが成功していることを確認します。


## モデルの作成
これからモデルを定義します。

:::note
モデルとは、データベースのレイアウトと、それに付随するメタデータのことです。
:::

これから開発する簡単な poll アプリケーションでは
「Question」と「Choice」の2つのモデルを作成します。


polls/models.pyを以下のように編集します


```python:polls/models.py

from django.db import models

# Create your models here.
class Question(models.Model):
	question_text = models.CharField(max_length=200)
	pub_date = models.DateTimeField("date published")

class Choice(models.Model):
	question = models.ForeignKey(Question, on_delete=models.CASCADE)
	choice_text = models.CharField(max_length=200)
	votes = models.IntegerField(default=0)

```


## モデルを有効にする

前述のようなほんのわずかなコードをモデルに書くだけで、
アプリケーションのデータベーススキーマを作成 (CREATE TABLE 文) できます。
また、Question や Choice オブジェクトに Python からアクセスするためのデータベースAPIを作成できます。


ただ、その前に、pollsアプリケーションをインストールしたことを
プロジェクトに教える必要があります。

アプリケーションをプロジェクトに含めるには、
構成クラスへの参照を INSTALLED_APPS 設定に追加する必要があります。 

mysite/settings.py を編集し、
INSTALLED_APPS 設定にpolls/apps.pyのPollsConfigパスを1行追記します。
（末尾のカンマを忘れずに）
そうすると下記のようになります


```python:mysite/settings.py

# Application definition

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

```

これで Django は、 polls アプリケーションが含まれていることを認識できます。

これでmigrationの準備ができました

まず、makemigrationsコマンドを実行します。
これはDjangoにモデルに変更があった場合、
または新規もモデルを作成した場合、
マイグレーションの形で保存することができます。

```
$ python manage.py makemigrations polls
```

成功すると次のような表示がされます

```
Migrations for 'polls':
  polls\migrations\0001_initial.py
    - Create model Question
    - Create model Choice
```

migrateを実行し、モデルのテーブルをデータベースに作成します。

```
$ python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK
```

これでmigrationの完成です。

Djangoのmigrate機能を使えば
モデルを変更する際に
テーブルを削除して作り直す必要はありません。

また
既存のデータはそのままに
モデルのアップグレードが可能です。