DjangoのModelの役割とサンプルコードについてサクッと理解する!

こんにちは!

「【個人開発】Djangoとは何か?初心者のための基本とサンプルコードを図解しながら実装する」の記事を読んでいただきありがとうございます。

本日は、Modelについての補足記事になります。

MVT(Model-View-Template)アーキテクチャの「M」にあたり、アプリケーションのデータ層を担当します。

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

禄太
簡単に言えば、Modelはデータベースとのやり取りを簡単にするための仕組みで、SQLを直接書かなくても、Pythonのコードでデータの作成・読み取り・更新・削除(CRUD操作)ができるようにします。

Model(models.py)の役割

  1. データベーススキーマの定義 : テーブルの構造とフィールドの型を定義する
  2. データ検証 : フィールドの制約やバリデーションルールを設定する
  3. リレーション管理 : テーブル間の関連性(一対一、一対多、多対多)を定義する
  4. データ操作 : データの作成・読み取り・更新・削除(CRUD)操作を行う
  5. ビジネスロジック : データに関連するビジネスロジックやメソッドを実装する

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長いテキスト(例:説明、記事内容)
EmailFieldEメールアドレス
URLFieldURL
SlugFieldスラッグ(URL用の文字列)
数値系IntegerField整数
FloatField浮動小数点数
DecimalField固定小数点数(金額など)
PositiveIntegerField正の整数
日時系DateField日付
TimeField時間
DateTimeField日付と時間
DurationField期間
ファイル系FileFieldファイル
ImageField画像ファイル
ブール値系BooleanFieldTrue/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) を使用することが推奨されます。

禄太
もちろん、これをすべて覚える必要はありません。必要になった時・実装しようと考えた時に「こういうフィールドはどうやって実装したらいいかな?」と調べられるようにしておけばOKです。

データ操作(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を扱う際の注意点

  1. 適切な命名 : モデル名は単数形で、フィールド名は明確で一貫性のあるものにする
  2. 適切なフィールドタイプ : データの性質に合ったフィールドタイプを選択する
  3. バリデーション : データの整合性を保つためのバリデーションを実装する
  4. ビジネスロジック : データ操作に関連するロジックはモデル内に実装する
  5. インデックス : 頻繁に検索・ソートされるフィールドにはインデックスを設定する
  6. 適切なリレーション : テーブル間の関係を適切に設計する

EOF

Djangoの [models.py] は、アプリケーションのデータ層を担当し、データベースとのやり取りを簡素化します。

適切に設計されたモデルは、アプリケーションの基盤となり、データの整合性を保ちながら効率的なデータ操作を可能にします。

モデルはMVTアーキテクチャの「M」として、ViewとTemplateがデータを適切に表示・操作するための基盤を提供します。良いモデル設計は、アプリケーション全体の品質と保守性に大きく影響します。

マイグレーションやリレーションについても記事を書きたかったのですが、少し長くなってきたので一旦ここで区切りたいと思います。

それでは、また次回の記事でお会いしましょう!