Web開発の世界では、データの管理と操作が非常に重要な役割を果たします。PythonのWebフレームワークであるDjangoは、このデータ管理を効率的に行うための強力なツールをモデル(models.py)として提供しています。
参考 Djangoとは?

Djangoのモデルは、データベースの構造を定義するためのPythonのクラスで、テーブルのカラムやリレーションを定義します。これにより、データベースとのやり取りが容易になり、データの整合性を保つことが可能となります。
このページでは、Djangoのモデルについて、その基本的な概念から具体的な使用方法まで、初心者向けにわかりやすく解説します。5つのステップを通じて、Djangoのモデルを理解し、効果的に使用する方法を学んでいきましょう。
Pythonエンジニア/Djangoを利用したWeb開発者を目指す方であれば知らないと恥ずかしい超・基本知識の1つ。是非最後までご覧ください。
ステップ1:Djangoモデル(models.py)の基本
Djangoのモデル(models.py)は、アプリケーションのデータを構造化し、Pythonのクラスとして定義します。これにより、データベースとのやり取りが容易になり、データの整合性を保つことが可能になります。

と説明されても、なかなかピンと来ない方も多いはずなので、この章では実際のサンプルコードを見つつ、Djangoモデルの基本的な要素とその役割について深めていきましょう。
モデルの定義(models.py の定義)
Djangoモデルは、Pythonのクラスとして定義。このクラスはdjango.db.models.Modelを継承します。モデルクラスの各フィールドは、モデルフィールドクラスのインスタンスとして定義され、これがデータベースの各項目を表します。

例えば、ブログ投稿を表すモデルを作成する場合、以下のように定義することができます。
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
参考 import文
モデルクラスの名前は、通常表現したいオブジェクトを表す名詞の単数形を使用。例えば、ブログ投稿を表すモデルを作成する場合、BlogPostという名前を使用します。
モデルクラス内のフィールドは、データベースの各列(カラム)を表します。フィールドの名前はPythonの変数として有効なものであれば何でも構いません。フィールドの型は、そのフィールドがどのようなデータを保存するかをDjangoに伝えます。
フィールド(項目)の種類
Djangoは多くの種類のフィールドを提供しています。これにより、様々な種類のデータをデータベースに保存することができます。以下に、いくつかの主要なフィールドを示します。
| フィールドタイプ | 用途 |
|---|---|
| CharField | 短い文字列 max_length(最大長を指定する必要があります) |
| TextField | 長い文字列 |
| DateTimeField | 日付と時間 |
| IntegerField | 整数 |
| BooleanField | 真偽値(True/False) |
| FloatField | 浮動小数点数 |
| EmailField | メールアドレス |

これらは一部の例であり、Djangoはこれら以外にも多くのフィールドタイプを提供しています。例えば、ImageFieldやFileFieldはファイルのアップロードを扱い、ForeignKeyやManyToManyFieldはモデル間のリレーションシップを表現します。
モデルのマイグレーション
モデルを定義したら、それをデータベースに反映する必要があります。これを行うために、Djangoはマイグレーションという機能を提供しています。マイグレーションは、モデルの変更をデータベーススキーマに適用する方法です。

マイグレーションを作成するには、以下のコマンドを実行します。
python manage.py makemigrations # Migrations for 'todo': # todo/migrations/0003_blogpost.py # - Create model BlogPost
このコマンドを実行すると、Djangoはモデルの変更を追跡し、それらの変更をマイグレーションファイルに記録します。次に、以下のコマンドを実行して、これらのマイグレーションをデータベースに適用するという流れ。
python manage.py migrate # Operations to perform: # Apply all migrations: admin, auth, contenttypes, sessions, todo # Running migrations: # Applying todo.0003_blogpost... OK
これにより、モデルの変更がデータベーススキーマに反映されます。

例えば、利用しているDBMSがMySQLの場合、スキーマ反映後は以下のようにきちんとテーブルが作成されていることが分かります。
mysql> desc todo_blogpost; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | title | varchar(200) | NO | | NULL | | | content | longtext | NO | | NULL | | | pub_date | datetime(6) | NO | | NULL | | +----------+--------------+------+-----+---------+----------------+
以上が、Djangoモデルの基本的な概念とその使用方法です。次のステップでは、具体的なモデルの作成方法について詳しく見ていきましょう。
ステップ2:Djangoモデルの作成方法

前章ではDjangoモデルの基本的な概念を学びました。今回はその知識を活かし、具体的なモデルの作成方法について見ていきましょう。
Djangoモデルを作成するためには、まず新しいアプリケーションを作成。以下のコマンドを実行して新しいアプリケーションを作成します。
python manage.py startapp your_app_name
このコマンドを実行すると、新しいアプリケーションディレクトリが作成され、その中にはmodels.pyというファイルが作成されます。

このmodels.pyファイルが、モデルを定義する場所です。
ブログ投稿を表すモデルを作成する場合、このmodels.pyにモデルを編集することで先ほどのようなテーブルを作成することができます。
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')

あとは、マイグレーション。マイグレーションを実行する際には、特定のアプリケーションを指定することもできます。
python manage.py makemigrations your_app_name
このコマンドを実行すると、Djangoはyour_app_nameアプリケーションのモデルの変更を追跡し、それらの変更をマイグレーションファイルに記録します。
ステップ3:Djangoモデルの操作方法
ここまでで、モデル(models.py)を作成し、データベースに反映する方法を学びました。

次はモデルを使ってデータベースの操作を行う方法について解説します。具体的には、データの作成、取得、更新、削除(CRUD操作)について説明します。
データの作成
Djangoモデルを使って新しいデータを作成するには、モデルクラスのインスタンスを作成し、それを保存。以下に、BlogPostモデルを使って新しいブログ投稿を作成する例を示します。
from django.utils import timezone from .models import BlogPost post = BlogPost(title='My first post', content='This is my first post.', pub_date=timezone.now()) post.save()
この例では、まずBlogPostクラスのインスタンスpostを作成しています。BlogPostの括弧内には、各フィールドの初期値を指定。

ここでは、titleには'My first post'、contentには'This is my first post.'、pub_dateには現在の日時(timezone.now())を設定しています。
最後に、save()メソッドを呼び出すことで、このインスタンスをデータベースに保存しています。この操作により、新しいブログ投稿がデータベースに作成されるという仕組みです。
データの取得
データベースからデータを取得するには、モデルクラスのobjects属性を使用します。objects属性は、モデルクラスに対するデータベースクエリを表すマネージャオブジェクトです。

以下に、すべてのブログ投稿を取得する例を示します。
posts = BlogPost.objects.all()
この例では、BlogPost.objects.all()がすべてのBlogPostオブジェクトを返します。この結果はPythonのリスト。つまり、forループを使って各ブログ投稿を順に処理することができる仕組みです。
モデルクラスのobjects属性には、条件を指定してデータを取得するためのメソッドが用意されています。

例えば、filter()メソッドを使用すると、指定した条件に一致するすべてのオブジェクトを取得することができます。以下に、タイトルが'My first post'であるすべてのブログ投稿を取得する例を示します。
posts = BlogPost.objects.filter(title='My first post')
この例では、filter(title='My first post')がタイトルが'My first post'であるすべてのBlogPostオブジェクトを返します。この結果はPythonのリストと同様に扱うことができます。
また、get()メソッドを使用すると、指定した条件に一致する一つのオブジェクトを取得することができます。ただし、get()メソッドは一致するオブジェクトが一つだけであることを期待しています。一致するオブジェクトがない場合や、複数存在する場合にはエラーが発生します。

以上のように、Djangoではデータを取得する際に様々な条件を指定することが可能です。これにより、必要なデータだけを効率的に取得することができます。
データの更新
データを更新するには、①データを取得し、②その属性を変更し、③再度保存します。以下に、最初のブログ投稿のタイトルを更新する例を示します。
post = BlogPost.objects.get(pk=1) post.title = 'Updated title' post.save()
この例では、まずget()メソッドを使用して最初のブログ投稿を取得しています。get()メソッドは、指定した条件に一致するオブジェクトをデータベースから取得します。ここでは、主キー(pk)が1のブログ投稿を取得しています。
次に、取得したブログ投稿のtitle属性を更新し、save()メソッドを呼び出して変更をデータベースに保存しています。

この操作により、ブログ投稿のタイトルが更新されます。
データの削除
データを削除するには、削除したいオブジェクトを取得し、そのdelete()メソッドを呼び出します。以下に、最初のブログ投稿を削除する例を示します。
post = BlogPost.objects.get(pk=1) post.delete()
この例では、まずget()メソッドを使用して最初のブログ投稿を取得。次に、delete()メソッドを呼び出してこのブログ投稿をデータベースから削除しています。この操作により、指定したブログ投稿がデータベースから削除されるという流れです。
以上が、Djangoモデルを使ったデータベースの基本的な操作方法です。これらの操作を理解し、適切に使い分けることで、Pythonコードからデータベースを効率的に操作することができるようになります。
Djangoモデル(models.py)のまとめ

始めてPythonを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。
Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!
読者料典 Python入門:学習カリキュラム ←こちらから!

