[Python]とにかくわかりやすく！Djangoでアプリ開発！ーその5ー

#前回の記事
前回の記事→[とにかくわかりやすく！Djangoでアプリ開発！ーその４ー](https://qiita.com/hiroyuki_mrp/items/8aa59ede3b31fd8dddb8)
上記の記事までのまとめ→[[Python]とにかくわかりやすく！Djangoでアプリ開発！ー中間まとめ[1-4]ー](https://qiita.com/hiroyuki_mrp/items/e9ffd90cc19f097416b7)

※前回までの記事、おかげさまでユーザーランキング7位までいきました。ありがとうございます。
![IMG_6992.jpg](https://qiita-image-store.s3.amazonaws.com/0/241505/3ce75a16-a994-1d66-af08-b5e0c0d223e1.jpeg)


#本記事の目的
python初心者の方が、本記事を見たあとに、一人でアプリ開発できることを目的にしております。
※インストールや開発環境については記載しません

#環境
macOSX　Sierra
python3.7
django 2.1.5

#前回まで
プロジェクトを立ち上げ(startproject)
→アプリの作成(startapp)
→view.pyを変更してレスポンスを書く
→urls.pyを修正する
→アプリの登録する
→index.html作る
→views.pyを直す
→htmlに変数入れる
→views.pyを直す
→複数ページ作るためにリンクつける
→views.pyを直す
→cssで装飾できるようにする
→htmlでフォームを作る
→views.pyを直す
→urls.pyを修正する
→やっぱりFormクラスでフォームを作る
→views.pyを直す
→index.html直す
→Viewクラスでview.pyをスッキリさせる
→Fieldをいじってみる

とここまででした。

ここからはDBとの連携を記載していきます。

#DBについて

Djangoで使えるSQLは以下になっています。

- MySQL:サーバータイプなのでwebサーバーとDBサーバーの間で通信を行います。
- PostgresQL:サーバータイプなのでwebサーバーとDBサーバーの間で通信を行います。
- SQLite:エンジンタイプなのでDBに直接アクセスを行います。

がDjangoにはすでにSQLiteが組み込まれています。そのファイルもすでにdb.sqliteとして用意されていますね。

#DBの設定を見てみる

設定に関することなので、myapp/settings.pyを見てみます。

デフォルトで設定されている項目が２つあります。
DBへのアクセスに使われるENGINEとDBそのものの名前を表すNAMEです。
os.path.joinはディレクトリパスを繋げているだけなので難しくないですね。

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```
僕はPostgreSQLを使うことが多いので以下の設定にすることもあります。

```python:settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': postgres,
        'USER': ユーザー名,
        'PASSWORD': パスワード,
        'HOST': ホスト名,
        'PORT': '5432',
    }
}
```

#テーブルを作る

ユーザー情報を管理できるようにテーブルを作成してみたいと思います。
テーブル定義に関しては割愛しますが、以前投稿した[こちらのDB構築の記事](https://qiita.com/hiroyuki_mrp/items/10322eeb29bb8e35987f)を参考にしてください。

でここからが大事になってきます。
テーブル定義をした後にSQLでcreate文でテーブルを作る必要はなく、models.pyで定義をしておけば、自動で生成をしてくれます。便利ですね。
モデルでclassを作り、それのインスタンスをテーブルのレコードとして利用することができます。

ということでmodels.pyを書き換えていきます。
今回はユーザー情報テーブルを作っていきます。冒頭にあるmodelsというクラスを継承して作成できるので簡単です。
`__str__`を用意して、内容をreturnで返せるようにしています。あとあとindex.htmlで{{}}で埋め込めます。

```python:models.py
from django.db import models

class Touroku(models.Model):
    name = models.CharField(max_length=30)
    gender = models.BooleanField()
    age = models.IntegerField(default = 0)

    def __str__(self):
        return '<ID:'+str(self.id)+'>  名前:'+self.name+' ('+str(self.age)+'歳)'
```

ここまでできたら、DBの立ち上げやアップデートに行うための「マイグレーション」を行います。
やることは２つだけ。「作成」と「適用」だけです。簡単です。
ターミナルで以下を打ち込みます。ディレクトリはmanage.pyがあるところです。

```terminal
$ python manage.py makemigrations #作成
```

```terminal
$ python manage.py migrate　#適用
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
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
　　　　Applying sessions.0001_initial... OK
```

エラーがでなければOKです！一度管理ツールを使ってDBを確認しておきます。
ということで管理者を作成しておきます。
*パスワードが雑すぎて警告でてますが無視します。

```
$ python manage.py createsuperuser
ユーザー名 (leave blank to use 'hiropy'): hiroyuki
メールアドレス: hogehoge@gmail.com
Password: 
Password (again): 
このパスワードは メールアドレス と似すぎています。
このパスワードは短すぎます。最低 8 文字以上必要です。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
```

次は管理ツールで先ほど作ったクラス(モデル)を使えるようにします。
admin.pyの中身を書き換えます。クラスを呼び出して、さらにadminのregisterメソッドを使ってクラスを登録します。

```
from django.contrib import admin
from .models import Touroku

admin.site.register(Touroku)
```

ここまできたらブラウザで127.0.0.8000/adminにアクセスします。毎度ですがrunserverしておいてください。

以下のような認証画面がでてきます。

<img width="409" alt="スクリーンショット 2019-02-11 19.03.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/e28f7ad8-2034-c8ff-4c65-da7442e25e39.png">

認証して、自身で定義したモデルが入っていればOKです！

<img width="863" alt="スクリーンショット 2019-02-11 19.05.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/a7d2d244-0fb3-324d-efc0-aaaf85930075.png">

あとは適当な名前で登録を行います。テストなのでなんでも。

<img width="861" alt="スクリーンショット 2019-02-11 19.13.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/30a5824a-a201-5680-00ec-26d130668f9b.png">

ここで疑問に思った人がいるかと思います。「ID」っていつ振ったんだろうと。定義しなかったものです。

ここでマイグレーションによって実は生成されてた、app1/migration配下の0001_initial.pyをみてみます。
Migrationというものが作られていて、operationsという変数の中に、テーブルを作るための定義が記述されています。この中のidの部分をみてみると**AutoField(auto_created=True**と記載されていることから、自動で割り振られていることがわかります。

```python
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Touroku',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=30)),
                ('gender', models.BooleanField()),
                ('age', models.IntegerField(default=0)),
            ],
        ),
    ]
```

と少し話はそれましたが、ユーザーなどの追加に関してもこの管理ツールを使えば簡単に行うことができます。


この後のアプリ本体からDBにアクセスし、情報を表示させることに関しては少し長くなるので、次回の記事に記載していきます。

#この記事はここまで

続きはこちら→[[Python]とにかくわかりやすく！Djangoでアプリ開発！ーその６ー](https://qiita.com/hiroyuki_mrp/items/af644b610c843eb2d0d3)