【Django】モデル・マイグレーション完全ガイド|フィールド設計からリレーションまで徹底解説

Djangoに触り始めた頃、モデルの前にまずデータベースそのものをよく知りませんでした。

モデルのクラス定義自体はPythonなので読めます。ただ、フィールドの引数に何を設定できるのか、それがDB側でどういう意味を持つのかがわからず、最初はそこでつまずきました。

この記事では、モデルの基本的な書き方から、よく使うフィールドの種類、リレーション設計、マイグレーションの仕組みまでを解説します。

Djangoのプロジェクト構成がまだの方は、先にこちらを読んでおくとスムーズです。

Djangoモデルとは何か

Djangoのモデルは、データベースのテーブルをPythonのクラスとして表現したものです。モデルクラス1つが、テーブル1つに対応します。

Python
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    published_at = models.DateTimeField(auto_now_add=True)

クラス変数の1つ1つがテーブルのカラムになります。CharFieldTextFieldといった型の指定が、SQLで言うVARCHARTEXTにあたります。SQLを自分で書く必要はありません。

フィールドの引数、最初はここでつまずいた

フィールドにはそれぞれ引数があります。CharField(max_length=100)max_lengthのような部分です。

僕がつまずいたのはここでした。DBを触ったことがなかったので、「なぜ文字列に長さの上限を指定する必要があるのか」からしてピンときていませんでした。よく使う引数だけ、先に押さえておきます。

引数意味
max_length文字列の最大長(CharFieldで必須)
nullDB側でNULLを許可するか
blankフォーム入力で空欄を許可するか
defaultデフォルト値
unique値の重複を許可しないか

特にnullblankは名前が似ていて紛らわしいポイントです。nullはDBの制約、blankはフォームバリデーションの話。役割が違うので、両方Trueにしたい場面以外は分けて考えるようにしています。

よく使うフィールドタイプ

実務でよく使うフィールドはそれほど多くありません。まずはこのあたりを覚えておけば大抵の場面に対応できます。

フィールド用途
CharField短い文字列(名前・タイトルなど)
TextField長い文字列(本文など)
IntegerField整数
BooleanFieldTrue / False
DateTimeField日時
ForeignKey他のテーブルとの多対1のリレーション

テーブル同士をつなぐ:リレーション設計

テーブル同士を関連づけるにはForeignKeyを使います。「1人のユーザーが複数の記事を書く」というような、多対1の関係を表現できます。

Python
from django.conf import settings
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="articles",
    )

on_deleteは、参照先(ここではユーザー)が削除されたときの挙動です。CASCADEを指定すると、ユーザーが削除された時に紐づく記事も一緒に削除されます。related_nameを指定しておくと、ユーザー側からuser.articles.all()のように逆方向にたどれるようになります。

フィールド設計に固定ルールは持っていない

「このケースは必ずこう設計する」という固定のルールは、正直あまり持っていません。実際の運用を考えて、そのつど判断するようにしています。

たとえば同じ「日付」でも、後から変更されうるデータなのか、記録として残すだけのデータなのかで、nullを許可するかどうかの判断は変わります。設計を先に完璧に詰めるより、実際にどう使われるかをイメージしながら決めるほうが、結果的にうまくいく感覚があります。

マイグレーションを実行する

モデルを書いただけでは、まだDBにテーブルは作られません。マイグレーションという仕組みを通して、モデルの定義をDBに反映します。

Bash
# モデルの変更内容から、マイグレーションファイルを生成
python manage.py makemigrations

# 生成されたマイグレーションをDBに適用
python manage.py migrate

makemigrationsが「変更内容の差分」を記録したファイルを作り、migrateがそれを実際にDBへ適用する。この2段階に分かれているおかげで、適用前に差分の内容を確認できます。

まとめ

Djangoのモデルは、SQLを直接書かなくてもDBを操作できる仕組みです。フィールドの型・引数・リレーションの基本を押さえれば、あとは実際の運用に合わせて設計を調整していけば十分です。

DBを触ったことがない方にとっては、Djangoのモデルを通すことで、直感的にDBの考え方を学べるはずです。僕自身、DBの知識はDjangoのモデルを書きながら身についていきました。

モデルが書けるようになったら、次はそのデータを画面に表示するビューとURLルーティングに進みましょう。

Django全体のロードマップに戻りたい方はこちらからどうぞ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段は主にPython開発をしています。
最近はAI駆動開発にも関わっています。

コメント

コメントする