入門クラス 初心者向け

【Django】モデルについて

モデルとは何か

モデルとは、データベースに保存するデータを定義するクラスのことです。

また、実際にデータベースとデータの保存や読み出しのやりとりをするのもモデルです。

主にデータまわりを担当している、と考えて差し支えないと思います。

ちょっと何を言っているのか分からないかもしれませんが、例を交えて説明します。

models.py

モデルは基本的にmodels.pyに記述します。

モデルの定義はこの後に紹介しますが、ひとつのmodels.pyに複数のモデルを記述しても問題ありません。

Pythonなので当たり前といえば当たり前ですが、models/article.pyのように、Pythonモジュールとして作成してもOKです。

実際に使ってみる

では、早速モデルを定義してみましょう。

アプリケーションの内部にあるmodels.pyを編集します。

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

シンプルなモデルはこのように記述します。

このように定義することで、以下のようにして値を取得することができます。

article = Article()

title = article.title
content = article.content

print(title, article)

また、以下のようにして値を設定することができます。

article = Article()
article.title = 'foo'
article.content = 'super long content'

article.save()  # 設定した値を保存

Pythonのクラスとほとんど同じですね。
少し違うのは、保存するときはsave()メソッドを呼ぶ必要があることです。

このメソッドによってモデルのデータをデータベースに保存します。

viewにおいて、このモデルの機能を使ってデータが呼び出されてテンプレートで使用できるようになったり、データを受け取って保存したりします。

モデルの定義

モデルの定義はクラスを定義することで行います。

クラス定義をする時、Djangoが提供しているmodels.Modelを継承します。
これによってモデルを使う上での様々な機能が提供されます。

そして、クラス変数としてフィールドを定義します。

フィールドとは

フィールドとは、データベースでいうフィールドと考えて差し支えないと思います。

idtitlecontent
1some title1some content1
2some title2some content2
データベース内部のイメージ

Djangoではこのような感じでデータが保存されます。
身近なところではExcelの表に近いですね。

この一行をレコードと呼び、titlecontent部分をフィールドと呼びます。

よく見ると、レコードはフィールドの集まりで構成されています。

これDjangoで置き換えると、モデルクラスにクラス変数としてフィールドを定義することでモデルが一つのレコードを表現しています。

実際、このモデルを通してデータを保存していきますし、モデルのインスタンスにレコードのデータを代入されてデータの提供を受けたりします。

フィールドを定義してみる

フィールドが何者であるのかはわかりました。

では、実際に定義している部分を確認して解説していきます。

    title = models.CharField(max_length=100)
    content = models.TextField()

これが今回定義したフィールドです。

2つのフィールドが定義されています。

title フィールド

title = models.CharField(max_length=100)

この部分はCharFieldとして定義されています。CharFieldもクラスです。

CharFieldは短い文字列を表しています。
max_length=100でお分かりのとおり、今回は100文字まで保存できるフィールドとなっています。

そして、このフィールドの名前はtitleとしています。

逆の言い方をすれば、titleフィールドは100文字までの文字列を保存できます。

content フィールド

    content = models.TextField()

この部分はTextFieldとして定義されています。TextFieldもクラスです。

TextFieldは長い文字列を表しています。
このフィールドはデータベースの設定が許すかぎり、いくらでも長い文字列を保存できます。

そして、このフィールドの名前をcontentとしています。

逆の言い方をすれば、contentフィールドは長文を保存できます。

フィールドのまとめ

Djangoではモデルクラスにフィールドを定義することによって保存するデータを指定する事ができます。

マイグレーション

マイグレーションとは、モデルクラスに定義されたフィールドの定義をデータベースに適用することです。

Djangoで使用するデータベースはあらかじめどのようなデータが保存されるのかを設定して準備しなければなりません。

モデルクラスを定義しただけではそのデータベースの準備ができていない状態です。

ですので、モデルクラスで定義されたフィールドのデータが保存されるようにデータベースを設定する必要があります。

その事をマイグレーションと呼びます。

Djangoでははじめにマイグレーションファイルを作成します。これはマイグレーションの手順書のようなもので、Djangoコマンドを実行する事で自動的に生成されます。

とても楽チンですね。

そして、そのマイグレーションファイルを使って、実際のマイグレーションが実行されるのです。

モデルクラスに新しいフィールドを追加するなどして変更が入った場合、追加のマイグレーションファイルを生成してマイグレーションを実行する必要があります。

モデルクラスの変更が自動的に追跡されます。

開発者が自分でデータベースの変更を記述する事はほとんどありません。

実際にやってみる

では、実際にマイグレーションしてみましょう。

マイグレーションの一連の流れは全てコマンドラインからおこないます。

マイグレーションファイルを生成する

まずはマイグレーションファイルの生成です。

python manage.py makemigrations

実行するとアプリケーションフォルダの中にmigrationsフォルダが生成されます。そしてさらにその中にマイグレーションファイルが生成されます。

マイグレーションファイルは番号と日付、そして変更内容を元にしたファイル名が自動的につけられます。

日付がファイル名に付けられるのは複数人での開発が行われた際にマイグレーションの順番が重要になるため、適用する順番を守るためです。

ここまでではまだ、データベースに変更が反映されていません。

マイグレーションする

生成されたマイグレーションファイルを元に、データベースに変更を加えるには以下のコマンドを実施します。

python manage.py migrate

このコマンドを実行することによって全てのアプリケーションでデータベースのマイグレーションが行われます。

どれかひとつのアプリケーションだけマイグレーションしたい場合は、引数にアプリケーションの名前を指定します。

python manage.py migrate article

このようにするとarticleアプリケーションのみマイグレーションできます。

複数のマイグレーションファイルがある場合は、日付の古い方から順に実行されます。

対象となるデータベース

変更の対象になるデータベースは、デフォルトではsqlite3です。

マイグレーションは一度にひとつのデータベースしかマイグレーションしません。

もし、開発環境とプロダクション環境が分かれている場合などは環境変数やコマンドライン引数で環境を指定して何度も実行する必要がありますので注意してください。

マイグレーションを戻す

あまり触れられないのですが、マイグレーションを戻す事ができます。

まずはマイグレーションの一覧を表示させてみます。

python manage.py showmigrations

このようにすると、各アプリケーションに適用されている、もしくは適用予定のマイグレーションが一覧できます。

そこから戻したいマイグレーションの名前を確認してください。ファイル名になっています。

そして、migrateコマンドでその名前を指定すればそのマイグレーションまで戻ります。

マイグレーションを未適用の状態、つまり無かった事にするには、名前の部分にzeroを指定します。

python manage.py migrate article zero

このようにすればarticleアプリケーションのマイグレーションは無かったことになります。

マイグレーションのエラー

マイグレーションを実行する時にエラーが発生する事があります。

メッセージを良く読めば大抵は解決できるのですが、入門・初心者のうちはよく分からないものです。

もし、練習でDjangoを使っているのであれば、sqlite3のファイルの名前を変えるか、削除するとデータベースを作成するところから実行します。もちろん、データはなくなります。

データがなくなるのは痛いですが下手に悩むよりもこちらの方がリカバリが早いので、私はファイル名を変更して新しいデータベースを作成する事をお勧めします。

お勧めというか、私はそうやってました。

マイグレーションのマージ

ときどき、マイグレーションが失敗して、マージせよ、というメッセージが表示される事があります。

これはマイグレーションファイルが競合しているときに表示されます。

マイグレーションをマージするコマンドを実行することで解決しますので、表示されたコマンドを実行してみてください。

-入門クラス, 初心者向け