[Django] Model(データベース)の使い方

Djangoでモデル(データベース)の設定を行うにはmodels.pyに設定を記載します。Djangoにはデータベースを管理する仕組みが搭載されていて多様なDBを扱うことができます。

Djangoのモデルの記述方法を学ぶと、直接SQL文を書かずにDBを扱うことができてとても便利です。

Modelの作成

Personというテーブルを作成するときは以下のように記載します。

Class [テーブル名] (models.Model): でテーブル名を指定します。

その下にカラムの設定を行います。Filedに使う設定の一覧です。

Filed一覧

Field説明
CharField文字列
TextField文字列(長い)
IntegerField整数
PositiveIntegerField0または正の整数
FloatField浮動小数点
BooleanFieldTrue / False
JSONFieldJSONエンコードされたデータ
DateTimeField日付・時刻
DateField日付
TimeField時刻
EmailFieldメールアドレス(@マークが無いとエラー)
URLFieldURL(http , https , ftp , ftpsが無いとエラー)
GenericIPAddressFieldIP Address
FileFieldファイル
ImageField画像ファイル
SlugField文字列限定(アルファベット・数字・アンダーバー・ハイフン)

Django Model名の命名規則

モデル名は基本的に単数形で定義します。Django管理用画面では複数形のsが付いて表示されます。(こちらはDjangoが自動で複数形にしています)

キャメルケース記述で Category、複数の単語をつなげるときは SampleCategoryのようにします。

categoryの複数形はcategoriesですが、DjangoだとCategorysと単純に後ろにsが付いた形になります。これはMetaオプションで修正することができます。

Django Modelの属性(カラム)命名規則

Django Modelの属性はスネークケースで書きます。category_nameの形式です。

よく使うものは命名の規則を決めておくと可読性が良くなります。

_name , _code , _id , _no , _date , _time , _dt(日時), _num , _type , is_(真偽値) , _file など

Fieldの詳細設定方法

CharField

max_lengthは設定しないと「CharFields must define a ‘max_length’ attribute.」エラーが出ます。255文字以上になる場合はCharFieldではなく、TextFieldを使います。

BooleanField

DateTimeField / DateField / TimeField

日付時間型のオプションは「auto_now_add」と「auto_now=True」になります。

FileField

ファイルを登録する場合、パスと拡張子を指定するオプションがあります。

ImageField

画像を登録するときもファイルと同様、パスと拡張子を指定するオプションがあります。

FieldOption

一対一(OneToOneField)

on_deleteオプションはリレーションシップされているモデルのデータをどのように扱うかを設定します。

種別説明
models.CASCADEデータ削除時に参照しているデータも連動して削除(デフォルト設定)
models.PROTECT別モデル(テーブル)から参照させれていると削除できない
models.RESTRICT削除エラーが表示される。片方のデータが削除され、紐づく先のデータは残る
models.SET_NULL参照先のレコードをNullに設定(参照先でNullが許可されている必要あり)
models.SET_DEFAULT参照先のレコードをDefault値に設定(カラムにDefalut値の設定が必要)

user (id , name ) / address (id , address ) という2つのモデル(テーブル)が存在する場合、addressモデルにOnetoOneFieldを設定するとuser_idというカラムが自動に生成されます。userモデルのidとaddressモデルのuser_idカラムがリレーションされます。

一対多(ForeignKey)

一対多の場合はForeingKeyを使います。一対多のリレーションはテーブルの1つのレコードが他のテーブルの2つ以上とリンクする場合を指します。

一人の人が複数のブログ記事を投稿する、出版社が複数の種類の本を出版しているなどのケースが該当します。

自動車会社が複数の車を作っている場合のケースです。

ManufacturerテーブルのidフィールドとCarテーブルに自動生成されたmanufacturer_idフィールドが紐づくようになります。

主キーを自動連番以外に設定する場合

下記は本とショップの2つのモデルを一対多でリレーションする例です。BookCodeは連番ではなく4桁の文字列を使います。

まず、BookモデルにBookCodeカラムを作成し、重複なし・主キーの設定を行います。

StoreモデルでBookCodeカラムにForeignKeyを設定します。on_deleteはBookのデータが消されたときにリレーションしているStoreの情報も自動削除する設定になります。

def __str__(self): は管理画面にデータの内容を表示する設定です。これを設定しないと管理画面で何のデーターがあるのかがわかりません。この例ですと

[本のコード] 本の名前 を表示します。

多対多(MyanyToManyField

多対多リレーションは特定のテーブルの複数レコードが、他のテーブルの複数レコードと紐づくケースが該当します。

複数のブログ記事に、複数のカテゴリーが登録されている。複数の車に、複数の色が割り当てられている場合などが当てはまります。

ピザとトッピングの2つのテーブルを多対多で関連付けてみます。

公式ドキュメントから引用していますが、このケースの場合、Pizzaの方にだけManyToManyFieldが設定されています。Pizza , Topping どちらに定義しても良いですが、どちらか片方にのみ設定するのがルールになっています。また ManyToManyField のフィールド名は関係先モデルのフィールド名の複数形が推奨されています。Pizzaテーブル側に設定するのでToppingテーブルの複数形 toppings をフィールド名として設定します。

多対多の場合、2つのテーブルの他に中間テーブルが設定されます。両方のIDを関連付けて管理するためです。

中間テーブルはcar_pizzaとなり、 id , car_id , pizza_id というフィールドが作られます。

更に複雑な多対多のリレーションは以下のように記載します。詳しい解説はDjango公式ホームページ参照

データーベースへの反映

まず、models.pyにモデルを定義したら、データベーススキーマに反映させます。まずはマイグレーションを行います。Djangoがモデルに記載された内容を分析し、マイグレーションファイルを作成します。DBに登録する準備を行うと考えるとわかりやすいです。ターミナルから以下のコマンドを実行します。

マイグレーション

マイグレーションの段階ではDBに変更は何もされません。以下のマイグレートを実行することによりDBに反映されます。こちらもターミナルから下記のコマンドを実行します。

マイグレート

マイグレートのロールバック

マイグレートを戻すには、下記のような手順を踏みます。

まず、マイグレーションの一覧を表示します。

最後にアプリ名を付けるとアプリに関するマイグレーション情報が表示されます。アプリ名を付けないとプロジェクト全体のものが表示されます。

今までDjangoProject初回のマイグレーション、次にCompanyというテーブルを作成、その次にBookというテーブルを作成しています。

今回は3回目に作成したBookというテーブルを削除して、0002の状態に戻してみます。

一つ前の状態を指定するのがポイントです。

0003番の✗が消えて一つ前の状態に戻りました。

あとはmigrationディレクトリで該当するファイルを削除すれば完了です。

(参考)



Author: webmaster