PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（３）【アプリケーション作成・DB設定編】

# 解説記事の構成

|No.|タイトル||
|:--:|:--|:--:|
|1|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（１）【環境構築編】](http://qiita.com/carat_yoshizaki/items/f3c79e38b802c7fc8863)||
|2|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（２）【プロジェクト作成編】] (http://qiita.com/carat_yoshizaki/items/926f702198bdfe8c6bd2)||
|3|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（３）【アプリケーション作成・DB設定編】] (http://qiita.com/carat_yoshizaki/items/c9a5299b77b99ff07e4a)|←|
|4|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（４）【ルーティング設定・MTVデザインパターン入門編】](http://qiita.com/carat_yoshizaki/items/fbd235008d7484089270)||
|5|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（５）【Django shellでDB操作入門編】](http://qiita.com/carat_yoshizaki/items/8c57144dfd37e005fb17#_reference-8f82e1176420484c2fdd)||
|6|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（６）【MTVデザインパターン完成編】](http://qiita.com/carat_yoshizaki/items/f0b4f7d7fa3899f2d424)||



# 開発環境

* OS: Mac OS Sierra (10.12)
* Python 3.5.2

Macの環境を前提として話を進めていきます。

Pythonのバージョン確認は以下の通りです。

```bash
$ python3 --version
Python 3.5.2
```



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

今回は、Djangoのアプリケーション作成から始めていきます。

プロジェクトの中に、アプリケーションを作成します。
ここでは、[Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/)にならって、ブログを作っていきます。

```bash
$ python3 manage.py startapp blog
```

以下のようなディレクトリ構成になります。

```bash
myvenv
├── bin
├── blog
├── db.sqlite3
├── include
├── lib
├── manage.py
├── myapp
└── pyvenv.cfg
```

アプリケーション作成後はまず設定ファイルの変更を行います。
使用するアプリケーションをDjango上で定義するためです。

以下のようなコードを見つけ、最下部に ```blog``` を追加してあげましょう。

```py:myapp/settings.py
# Application definition
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
)
```

## モデルの作成

```blog``` で使用する ```Model``` を作っていきます。
```Model``` とはデータを格納できる便利なオブジェクトといったところでしょうか。
この ```Model``` 自体にメソッドを持つことも出来ますし、DBとのやりとりもこの ```Model``` のお陰でSQLなどをあまり気にすることなく取り扱うことができます。

では、```blog``` 用の ```Model``` を定義していきます。
```blog/models.py``` を開き、以下のように書き換えます。

```py:blog/models.py
from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title  = models.CharField(max_length=200)
    text   = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title
```

ここは説明が少し長くなりますが、必要なところだけ [Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/django_models/) の説明から以下、抜粋します。

> class Post(models.Model): - この行が今回のモデルを定義します (これがオブジェクトです).

> * classはオブジェクトを定義してますよ、ということを示すキーワードです。
* Postはモデルの名前です。クラス名は大文字で始めます。
* models.ModelはポストがDjango Modelだという意味で、Djangoが、これはデータベースに保存すべきものだと分かるようにしています。
>
プロパティを定義しましょう：
　title、text、created_date、published_date、author
まずフィールドのタイプを決めなければいけません。
　テキスト？数字？日付？他のオブジェクト、例えばユーザーとの関係
>
* models.CharField - テキスト数を定義するフィールド
models.TextField - これは制限無しの長いテキスト用
* models.DateTimeField - 日付と時間のフィールド
* models.ForeignKey - これは他のモデルへのリンク

このようにして、モデル内で使用するプロパティの型を宣言するようですね。

余談になりますが、Ruby on Rails では、

```bash
$ rails g model post author title text
```
のように宣言することで、マイグレーションファイルが作成されていたので、それと比べるとちょっと面倒な気もします。

モデルの定義が終わったので、マイグレーションファイルを作成します。

```bash
$ python3 manage.py makemigrations blog
Migrations for 'blog':
  0001_initial.py:
    - Create model Post
```

これにより、Djangoがデータベースに入れるためのマイグレーションファイルを作成してくれるため、マイグレーションを行います。

```bash
$ python3 manage.py migrate blog
Operations to perform:
  Apply all migrations: blog
Running migrations:
  Rendering model states... DONE
  Applying blog.0001_initial... OK
```

これで ```Post``` モデルが無事にDB（SQLite）へ反映されました。

## DBの確認

Djangoでは初心者にも分かりやすいように、ブラウザ経由のGUIでモデルの確認が出来るようになっています。
これを、Django adminと呼ぶようです。

まず、 ```blog/admin.py``` ファイルを開いて、先ほど作成したPostモデル用にDjango adminを変更します。

```py:blog/admin.py
from django.contrib import admin
from .models import Post

# Register your models here.
admin.site.register(Post)
```

これで設定は完了です。

サーバーを起動して、ブラウザからDjango admin (http://127.0.0.1:8000/admin) にアクセスしていきましょう。
※ 別のターミナルを開き、常にこのサーバーを立ち上げておくことを推奨します。

```bash:サーバー起動
$ python3 manage.py runserver
```
<img width="590" alt="スクリーンショット 2016-11-11 2.45.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/130181/b9f2ffa5-a528-6145-4e8e-0d1c3b7f4584.png">

うまくいけばこのようなウェブページにアクセスできます。
ただ、ログイン画面が表示されており、設定した記憶がありませんよね？
それもそのはず、ログインするには別途 ```superuser``` (サイトの管理者) を作る必要があります。

それでは、```superuser``` を作っていきましょう。

```bash:superuserの作成
$ python manage.py createsuperuser
Username (leave blank to use 'your_name'): admin
Email address: email@example.com # メールアドレスを個別に設定
Password: # パスワードを入力
Password (again): # パスワードをもう一度
Superuser created successfully.
```

これで ```superuser``` の作成が完了しました。
もう一度、Django admin (http://127.0.0.1:8000/admin) にアクセスし、ログインしてみましょう。

<img width="508" alt="スクリーンショット 2016-11-11 2.52.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/130181/ca39b551-4b9c-6c37-d48f-6e7a94029db7.png">

さきほど作成した ```superuser``` でログインします。

<img width="1280" alt="スクリーンショット 2016-11-11 2.52.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/130181/a552f51b-684a-a093-3f79-7de5ec39f8c7.png">

無事ログイン出来ると、このような画面にアクセスできます。
モデル名は ```Post``` として宣言していましたが、```Posts``` と自動的に複数形になっています。

画面上の ```Posts``` の追加から試しに記事を追加してみましょう。
<img width="1279" alt="スクリーンショット 2016-11-11 2.56.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/130181/4ee7535a-7047-4fa2-82eb-83515de915b9.png">

登録をすると、DB上に新しい記事が作成されました。
<img width="668" alt="スクリーンショット 2016-11-11 3.01.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/130181/f253268d-0a39-5d74-30e3-4b409104a177.png">

*このときに python2系だと ```Unicode error``` とかがでるため、python3系を使用することを推奨します。
python2系は日本語を扱うのが非常に面倒であるため、こういった点が改善されているだけでもpython3系は重宝します。

これでDBの確認は完了です。
これからはDBを確認したいときは、Django adminに助けて貰いましょう。

これでモデルを設定し、DBへ反映、確認ができるようになりました。

次回は、オリジナルのテンプレートを作成し、View側を編集できるようになるところまでをやっていきます。

# 次回の解説記事
[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（４）【ルーティング設定・MTVデザインパターン入門編】](http://qiita.com/carat_yoshizaki/items/fbd235008d7484089270)

# 参考文献

* [Django](https://www.djangoproject.com/)
* [Django Girls Tutorial「Djangoモデル」](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/django_models/)

# おまけ

フォローお待ちしています！

* Qiita: [Carat 吉崎](http://qiita.com/carat_yoshizaki)
* twitter：[@carat_yoshizaki](https://twitter.com/carat_yoshizaki)
* はてなブログ：[Carat COOのブログ](http://carat-tech.hatenablog.com/)
* ホームページ：[Carat](http://caratinc.jp)

サービス紹介
「数学→プログラミング→Webアプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「[キカガク](https://kikagaku.net)」に興味のある方はお気軽にご連絡ください。