こんにちは!
「【個人開発】Djangoとは何か?初心者のための基本とサンプルコードを図解しながら実装する」の記事を読んでいただきありがとうございます。
本日は、Modelについての補足記事になります。
MVT(Model-View-Template)アーキテクチャの「M」にあたり、アプリケーションのデータ層を担当します。

Djangoフレームワークにおける「Model」は、データベースのテーブル構造を定義し、データの操作を行うためのPythonクラスです。

Model(models.py)の役割
- データベーススキーマの定義 : テーブルの構造とフィールドの型を定義する
- データ検証 : フィールドの制約やバリデーションルールを設定する
- リレーション管理 : テーブル間の関連性(一対一、一対多、多対多)を定義する
- データ操作 : データの作成・読み取り・更新・削除(CRUD)操作を行う
- ビジネスロジック : データに関連するビジネスロジックやメソッドを実装する
Modelの基本構造
[models.py]ファイルの中身は、カラム(列)になんのデータを入れないかを直接記述していきます。例えば何かの商品(衣服や食品など)を想定して以下のような在庫の管理テーブルを用意してみます。
from django.db import models
class Product(models.Model):
# フィールド定義
name = models.CharField(max_length=100) #商品名
description = models.TextField(blank=True) #商品の説明(シャツ/ワンピースなど)
price = models.DecimalField(max_digits=10, decimal_places=2) #商品の金額
stock = models.IntegerField(default=0) #商品の在庫
created_at = models.DateTimeField(auto_now_add=True) #商品をシステムに登録した日付
updated_at = models.DateTimeField(auto_now=True) #商品に対して何か更新をした日付(例:セール期間中だから値下げした)
主なフィールドタイプ
種類 | フィールドタイプ / オプション | 説明 |
---|---|---|
文字列系 | CharField | 短いテキスト(例:名前、タイトル) |
TextField | 長いテキスト(例:説明、記事内容) | |
EmailField | Eメールアドレス | |
URLField | URL | |
SlugField | スラッグ(URL用の文字列) | |
数値系 | IntegerField | 整数 |
FloatField | 浮動小数点数 | |
DecimalField | 固定小数点数(金額など) | |
PositiveIntegerField | 正の整数 | |
日時系 | DateField | 日付 |
TimeField | 時間 | |
DateTimeField | 日付と時間 | |
DurationField | 期間 | |
ファイル系 | FileField | ファイル |
ImageField | 画像ファイル | |
ブール値系 | BooleanField | True/False |
リレーション系 | ForeignKey | 外部キー(一対多の関係) |
OneToOneField | 一対一の関係 | |
ManyToManyField | 多対多の関係 | |
フィールドオプション | null | データベースでNULLを許可するか(デフォルトはFalse) |
blank | フォームで空を許可するか(デフォルトはFalse) | |
default | デフォルト値 | |
choices | 選択肢のリスト | |
help_text | 管理画面などでのヘルプテキスト | |
unique | 一意制約(デフォルトはFalse) | |
verbose_name | 人間が読みやすい名前 | |
editable | 編集可能かどうか(デフォルトはTrue) |
注)NullBooleanField は、近年のDjangoでは非推奨 (deprecated) となっているため、こちらの表からは除外しました。代わりに BooleanField(null=True) を使用することが推奨されます。

データ操作(CRUD操作)
Modelの機能を利用して、CRUD操作を実行することができます。
(データベースへ、データの作成・読み込み・更新・削除を行うことができます。)
過去、SQLを利用したCRUD操作について記事を投稿しました。
一方で、これから紹介する機能を利用すると、SQLをあまり意識することなくPython/Djangoの制御によってデータベースを操作することができるようになります。
作成(Create)
方法1:インスタンスを更新して保存
product = Product.objects.get(id=1)
product.price = 899.99
product.save()
方法2:create()メソッドを使用
product = Product.objects.create(name='Phone', price=499.99, stock=20)
読み取り(Read)
全てのレコードを取得
all_products = Product.objects.all()
特定のレコードを取得
#idなど、データを一意に決めるカラムを利用して読み込みます
product = Product.objects.get(id=1)
フィルタリング
cheap_products = Product.objects.filter(price__lt=500) # 500未満の価格の商品
in_stock_products = Product.objects.filter(stock__gt=0) # 在庫がある商品
laptops = Product.objects.filter(name__contains='Laptop') # 名前に'Laptop'を含む商品
更新(Update)
方法1:インスタンスを更新して保存
product = Product.objects.get(id=1)
product.price = 899.99
product.save()
方法2:update()メソッドを使用
Product.objects.filter(id=1).update(price=899.99)
削除(Delete)
方法1:インスタンスを削除
product = Product.objects.get(id=1)
product.delete()
方法2:条件に合うレコードを削除
Product.objects.filter(stock=0).delete()
Modelを扱う際の注意点
- 適切な命名 : モデル名は単数形で、フィールド名は明確で一貫性のあるものにする
- 適切なフィールドタイプ : データの性質に合ったフィールドタイプを選択する
- バリデーション : データの整合性を保つためのバリデーションを実装する
- ビジネスロジック : データ操作に関連するロジックはモデル内に実装する
- インデックス : 頻繁に検索・ソートされるフィールドにはインデックスを設定する
- 適切なリレーション : テーブル間の関係を適切に設計する
EOF
Djangoの [models.py] は、アプリケーションのデータ層を担当し、データベースとのやり取りを簡素化します。
適切に設計されたモデルは、アプリケーションの基盤となり、データの整合性を保ちながら効率的なデータ操作を可能にします。
モデルはMVTアーキテクチャの「M」として、ViewとTemplateがデータを適切に表示・操作するための基盤を提供します。良いモデル設計は、アプリケーション全体の品質と保守性に大きく影響します。
マイグレーションやリレーションについても記事を書きたかったのですが、少し長くなってきたので一旦ここで区切りたいと思います。
それでは、また次回の記事でお会いしましょう!