Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

解説記事の構成

No. タイトル
1 PythonのWebアプリケーション(Django)を初心者にもわかりやすく解説(1)【環境構築編】
2 PythonのWebアプリケーション(Django)を初心者にもわかりやすく解説(2)【プロジェクト作成編】
3 PythonのWebアプリケーション(Django)を初心者にもわかりやすく解説(3)【アプリケーション作成・DB設定編】
4 PythonのWebアプリケーション(Django)を初心者にもわかりやすく解説(4)【ルーティング設定・MTVデザインパターン入門編】
5 PythonのWebアプリケーション(Django)を初心者にもわかりやすく解説(5)【Django shellでDB操作入門編】
6 PythonのWebアプリケーション(Django)を初心者にもわかりやすく解説(6)【MTVデザインパターン完成編】

開発環境

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

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

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

$ python3 --version
Python 3.5.2

アプリケーションの作成

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

プロジェクトの中に、アプリケーションを作成します。
ここでは、Django Girls Tutorialにならって、ブログを作っていきます。

$ python3 manage.py startapp blog

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

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

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

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

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 を開き、以下のように書き換えます。

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 の説明から以下、抜粋します。

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 では、

$ rails g model post author title text

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

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

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

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

$ 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を変更します。

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) にアクセスしていきましょう。
※ 別のターミナルを開き、常にこのサーバーを立ち上げておくことを推奨します。

サーバー起動
$ python3 manage.py runserver

スクリーンショット 2016-11-11 2.45.57.png

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

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

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) にアクセスし、ログインしてみましょう。

スクリーンショット 2016-11-11 2.52.04.png

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

スクリーンショット 2016-11-11 2.52.11.png

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

画面上の Posts の追加から試しに記事を追加してみましょう。
スクリーンショット 2016-11-11 2.56.16.png

登録をすると、DB上に新しい記事が作成されました。
スクリーンショット 2016-11-11 3.01.20.png

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

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

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

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

次回の解説記事

PythonのWebアプリケーション(Django)を初心者にもわかりやすく解説(4)【ルーティング設定・MTVデザインパターン入門編】

参考文献

おまけ

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away