Djangoに触り始めた頃、モデルの前にまずデータベースそのものをよく知りませんでした。
モデルのクラス定義自体はPythonなので読めます。ただ、フィールドの引数に何を設定できるのか、それがDB側でどういう意味を持つのかがわからず、最初はそこでつまずきました。
この記事では、モデルの基本的な書き方から、よく使うフィールドの種類、リレーション設計、マイグレーションの仕組みまでを解説します。
Djangoのプロジェクト構成がまだの方は、先にこちらを読んでおくとスムーズです。

Djangoモデルとは何か
Djangoのモデルは、データベースのテーブルをPythonのクラスとして表現したものです。モデルクラス1つが、テーブル1つに対応します。
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つがテーブルのカラムになります。CharFieldやTextFieldといった型の指定が、SQLで言うVARCHARやTEXTにあたります。SQLを自分で書く必要はありません。
フィールドの引数、最初はここでつまずいた
フィールドにはそれぞれ引数があります。CharField(max_length=100)のmax_lengthのような部分です。
僕がつまずいたのはここでした。DBを触ったことがなかったので、「なぜ文字列に長さの上限を指定する必要があるのか」からしてピンときていませんでした。よく使う引数だけ、先に押さえておきます。
| 引数 | 意味 |
|---|---|
| max_length | 文字列の最大長(CharFieldで必須) |
| null | DB側でNULLを許可するか |
| blank | フォーム入力で空欄を許可するか |
| default | デフォルト値 |
| unique | 値の重複を許可しないか |
特にnullとblankは名前が似ていて紛らわしいポイントです。nullはDBの制約、blankはフォームバリデーションの話。役割が違うので、両方Trueにしたい場面以外は分けて考えるようにしています。
よく使うフィールドタイプ
実務でよく使うフィールドはそれほど多くありません。まずはこのあたりを覚えておけば大抵の場面に対応できます。
| フィールド | 用途 |
|---|---|
| CharField | 短い文字列(名前・タイトルなど) |
| TextField | 長い文字列(本文など) |
| IntegerField | 整数 |
| BooleanField | True / False |
| DateTimeField | 日時 |
| ForeignKey | 他のテーブルとの多対1のリレーション |
テーブル同士をつなぐ:リレーション設計
テーブル同士を関連づけるにはForeignKeyを使います。「1人のユーザーが複数の記事を書く」というような、多対1の関係を表現できます。
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に反映します。
# モデルの変更内容から、マイグレーションファイルを生成
python manage.py makemigrations
# 生成されたマイグレーションをDBに適用
python manage.py migratemakemigrationsが「変更内容の差分」を記録したファイルを作り、migrateがそれを実際にDBへ適用する。この2段階に分かれているおかげで、適用前に差分の内容を確認できます。
まとめ
Djangoのモデルは、SQLを直接書かなくてもDBを操作できる仕組みです。フィールドの型・引数・リレーションの基本を押さえれば、あとは実際の運用に合わせて設計を調整していけば十分です。
DBを触ったことがない方にとっては、Djangoのモデルを通すことで、直感的にDBの考え方を学べるはずです。僕自身、DBの知識はDjangoのモデルを書きながら身についていきました。
モデルが書けるようになったら、次はそのデータを画面に表示するビューとURLルーティングに進みましょう。

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


コメント