初心者のためのDjango入門
■第2話:DjangoのModelとView
(最終更新日:2023.01.06)
(絵が小さい場合はスマホを横に)
「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