Djangoでデータベース構築 (初学者がどこまで理解できるか(2))

#Djangoでデータベースを立ててみよう

[DjangoでHello world (初学者がどこまで理解できるか(1))](https://qiita.com/nn24nHi/items/334b0b1a7e406186a386)　の続きです。
作りたいものは、任意入力のアンケートです。
(例)質問：あなたは何歳ですか
(例)回答：3歳です
##データベースの選定
```py
#### practice/config/settings.py (何も変更は加えません)
*****
#参考までに、デフォルトで設定されているデータベースがこちら
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
*****
```
データベースは、デフォルトでSQLiteが選定されています。
`SQLite`：サーバー側での管理が不要なデータベース。password設定が不可なデメリットも。
MySQLや、PostgresSQLも使用可能。(ENGINE：を書き換えるで実現できる)

##データベースのテーブル作成
```py
#### practice/
$ python manage.py migrate
```
Djangoの設定ファイルに記載された、アプリケーション毎のデータベーステーブルを作成する。

```py
#### practice/config/settings.py (何も変更は加えません)
*****
#参考までに、デフォルトでインストールされているアプリケーションがこちら
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
*****
```

##アプリケーションとデータベースの接続口を作成
```py
#### practice/myapplication/models.py

from django.db import models

#質問用のデータに関するクラス
class Asking(models.Model):
    asking_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __str__(self):
        return self.asking_text

#回答用のデータに関するクラス
class Answering(models.Model):
    asking = models.ForeignKey(Asking, on_delete=models.CASCADE)
    answering_text = models.CharField(max_length=200)
    def __str__(self):
        return self.answering_text

```
`***Field`：models.Modelクラスには、文字列(Char)、数値(Integer)、時間(DateTime)などのデータを格納するフィールドがそれぞれあります。
`ForeignKey`：第一引数に指定したクラスを継承します。
`on_delete`：継承クラスが削除された際の挙動を指定します。
　　　　　　　`CASCADE`：一緒に消す、`PROTECT`：残す
##アプリケーションをDjango環境に認識させる
```py
#### practice/config/settings.py
****
INSTALLED_APPS = [
    #先頭行を追加し、アプリケーションを認識させる。
    #(フォルダ名).apps.(apps.py内のクラス名)
    'myapplication.apps.MyapplicationConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
****
```

```py
#### practice/
$ python manage.py makemigrations myapplication
```
これでアプリケーションをDjango環境が認識しました。
なお、`makemigrations`コマンドはmodels.pyのクラス自体が変更した場合に、データベースを更新するために行います。

```py
#### practice/
$ python manage.py migrate
```
更新されたデータベースで、テーブルを作成します。

##管理者サイトからデータをみてみましょう
```py
#### practice/myapplication/admin.py

from django.contrib import admin

from .models import Asking, Answering
#model.pyから、AskingとAnswerigクラスをひっぱり、管理者サイトに登録
admin.site.register(Asking)
admin.site.register(Answering)
```

```py
#### practice/config/settings.py

#言語コードとタイムゾーンを日本に変更
****
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
****
```

```py
#### practice/

#adminサイトにログインできるユーザーを作成
$ python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: **********
Password (again): *********
```
これで、管理者サイトに(admin)ユーザーで、ログインできる状態になりました。

```py
#### practice/
$ python manage.py runserver
```
開発用サーバーを起動し、`http://127.0.0.1:8000/admin`　にアクセスします。
ログイン後、画面に`asking`と`answering`フォルダができていればOKです。

<試せる事>
*askingで、質問事項と投稿日を入力・保存できるか。
*askingに対して、answeringで回答が入力・保存できるか。
*askingが削除されると、それに紐づくansweringも削除されるか。

##最後に
管理者サイトからデータベースへのアクセスはできました。
次は、htmlをDjangoに紐付けられるか試してみたいと思います。