Web制作、Web開発の歩き方

初心者のためのDjango入門

■第2話:DjangoのModelとView

(最終更新日:2023.01.06)

Djangoフレームワークのイメージ
この記事は6分で読めます!
(絵が小さい場合はスマホを横に)

「MVTってどうなの?」

Ruby on Rails等、他のMVCフルスタックフレームワーク(FW)を使ったことある人はこう思うかもしれない。 しかしながら、前回の図で説明したように、 ファイルやディレクトリ構成こそMVCに分かれていないとは言え、やってることは同じである。 今回は、そんなDjangoのMVTモデル、ModelとViewの部分の具体的な機能、記述方法を説明する。 残りのTemplate自体の使い方とFormの値をデータベースに送る流れは、次回説明する。


1.DjangoのModel

DjangoのModelクラスはデータベースTableと紐づく。 そして、そのModelクラスのプロパティはDBのフィールド名(下記のtitleやnumber)を意味する。 まずはここを押さえた上で、下記のModelクラスのコードを見てみよう。

左側のコードを見て分かる通り、非常に簡単なコードでデータベースTableを作成することができる。 作りたいTableのフィールド(titleとnumber)を宣言し、型(CharField、IntegerField)や文字数(max_length)等を指定するだけである。 idは自動的に作成される。「〇〇 = models.CharField(primary_key=True)」と設定すれば、id以外でプライマリーキーを作成することもできる。 Table名は「アプリケーション名_クラス名」となる。(Metaクラスを使って、アプリケーション名が接頭辞にならない書き方もできる)

DjangoのModelと作成されるTable

作りたいデータベースTableを記述したら、コマンド上で「python manage.py makemigrations」 と入力してみよう。 すると、Modelの記述をより具体的にした中間ファイル(migrationファイル)がmigrationsフォルダ内に生成される。 migrationファイルの内容を見ると、Tableに対してどういう命令しているのかがより具体的に分かる。

DjangoのMigrationファイル

続けて「python manage.py migrate」と入力すると、中間ファイルから命令してDjango内部でSQLを実行(この場合Create Table)してくれる。 Modelクラスを作成し2つのコマンドを実行するという流れだけ覚えておこう。

この流れで1点大事なことを説明する。migrationファイルは前回との差分だけを新たなファイルとして作成する。 つまり、このファイル群はSQLを生成するための命令だけでなく、データベース操作履歴、バージョン管理をしているのである。 例えば、各々0001_〇〇.pyと順に付番され、バージョンを管理できる。バージョン管理というだけあって勿論ロールバックもできる。

2.DjangoのView

次にDjangoのViewを説明する。下記で最初の行に書いた@login_requiredはデコレーターと言って定義した関数に機能を付加できる。 この関数を実行するにはログインが必要という制約を加えている。もしログインしない状態で「list/ 」URLにアクセスした場合は、 ログイン画面に遷移させ、ログインをユーザーに促す。 (どのページに遷移させるかはsetting.pyに命令として書く。) また、関数内のobject_listでGameModel(Table)から得られるデータを辞書型で全て取得している。 このデータは次のrenderでHTMLtemplateファイル上で取得できるようにしている。 最後のrenderで表示に使うHTMLファイル(logged_in/list.html)を指定している。

urls.pyでは、このlistviewを「/list/」にルーティングしている。これが関数ベースで作るDjangoのViewである。 ModelとTemplate(HTML)の仲立ちをしていることが分かったと思う。

他にもクラスベースViewというものがあるが、やっていることは同じである。 ただし、関数ベースのViewよりも簡潔に書ける。クラスベースViewについては、また何処かで説明しよう。

DjangoのViewの例(上)、そのViewに対応するurls.py(下)

▼参考図書、サイト

 「Djangoのツボとコツがゼッタイにわかる本」 大橋亮太 秀和システム
 「現場で使えるDjango管理サイトのつくり方」 横瀬明仁
   Djangoでマイグレーション【前編】 Selfs Ryo Com
   【Django】views.py:renderメソッドの使い方 OFFICE54