Django でデータベース操作を楽々! Models の使い方とサンプルコード集


Models は、Python クラスとして定義されます。各クラスは、データベース内の表に対応し、クラスの属性は表の列に対応します。Models を使用することで、以下の利点が得られます。

  • データ整合性の保証: Django は、Models の制約に基づいてデータ整合性を自動的に検証します。
  • データベース操作の簡素化: Django は、Models を基にデータベース操作を自動的に生成します。複雑な SQL クエリを書く必要がなく、コードが簡潔になります。
  • データ構造の定義: アプリケーションで使用するデータの種類と属性を明確に定義できます。

Models の基本構成

Models クラスは、以下の要素で構成されます。

  • メタオプション: Models に関する追加設定を指定できます。
  • 属性: 表の列に対応します。各属性には、データ型、制約条件、デフォルト値などを設定できます。
  • クラス名: データベース内の表名に対応します。

Models の定義例

from django.db import models

class Person(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)
  email = models.EmailField(max_length=254)
  birth_date = models.DateField()

この例では、Person という名前の Models クラスを定義しています。このクラスは、first_namelast_nameemailbirth_date という 4 つの属性を持っています。

  • DateField は、日付データ用のフィールド型です。
  • EmailField は、電子メールアドレス用のフィールド型です。
  • CharField は、文字列データ用のフィールド型です。

データベース操作

Models を定義したら、データベース操作を実行できます。

1 データの保存

person = Person(first_name="Taro", last_name="Yamada", email="[email protected]", birth_date="1985-01-01")
person.save()

このコードは、Person インスタンスを作成し、データベースに保存します。

2 データの取得

persons = Person.objects.all()
for person in persons:
  print(person.first_name, person.last_name)

このコードは、Person テーブルのすべてのレコードを取得し、ループで処理します。

リレーションシップ

Models では、データ間の関係を定義できます。

1 1対1のリレーションシップ

class Book(models.Model):
  title = models.CharField(max_length=100)
  author = models.ForeignKey(Person, on_delete=models.CASCADE)

この例では、Book モデルと Person モデルの間に 1対1 のリレーションシップを定義しています。これは、1 冊の本には 1 人の著者しかいないことを意味します。

2 1対多のリレーションシップ

class Author(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)
  books = models.ManyToManyField(Book)

この例では、Author モデルと Book モデルの間に 1対多のリレーションシップを定義しています。これは、1 人の著者が複数の本を書けることを意味します。

Models には、上記以外にも様々な機能が用意されています。

  • マネージャー: データ操作を抽象化するためのクラスです。
  • シグナル: データ操作時にイベントを発生させることができます。
  • カスタムバリデーション: データの入力規則を独自に定義できます。

Models に関する詳細は、以下のリソースを参照してください。

  • 書籍: 『Django チュートリアル 4.0』(翔泳社)


モデル定義

from django.db import models

class Person(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)
  email = models.EmailField(max_length=254)
  birth_date = models.DateField()

class Book(models.Model):
  title = models.CharField(max_length=100)
  author = models.ForeignKey(Person, on_delete=models.CASCADE)
  publication_date = models.DateField()

class Category(models.Model):
  name = models.CharField(max_length=30)
  books = models.ManyToManyField(Book)
  • Category モデル: 書籍のカテゴリ(小説、技術書など)を格納します。
  • Book モデル: 書籍のタイトル、著者、発行日などの情報を格納します。
  • Person モデル: 氏名、メールアドレス、生年月日などの情報を格納します。

Book モデルは Person モデルと 1対1 のリレーションシップを持ち、author フィールドを通じて関連付けられています。Book モデルは Category モデルと多対多のリレーションシップを持ち、books フィールドを通じて関連付けられています。

# Person データの保存
person = Person(first_name="Taro", last_name="Yamada", email="[email protected]", birth_date="1985-01-01")
person.save()

# Book データの保存
book = Book(title="Django チュートリアル", author=person, publication_date="2024-06-21")
book.save()

# Category データの保存
category = Category(name="プログラミング")
category.save()

# Book に Category を関連付け
book.categories.add(category)

# Person の全件取得
persons = Person.objects.all()
for person in persons:
  print(person.first_name, person.last_name)

# 特定の条件で Book を取得
books = Book.objects.filter(publication_date__year=2024)
for book in books:
  print(book.title)

# 特定の Author の Book を取得
author = Person.objects.get(first_name="Taro", last_name="Yamada")
books = author.book_set.all()
for book in books:
  print(book.title)

このコードは、モデル定義で説明した操作を実行する例です。

  • author.book_set.all() は、author に関連付けられたすべての Book を取得します。
  • Book.objects.filter(publication_date__year=2024) は、2024 年に発行されたすべての Book を取得します。
  • Person.objects.all() は、Person テーブルのすべてのレコードを取得します。
  • book.categories.add(category) は、Book インスタンスに Category インスタンスを関連付けます。
  • category.save() は、Category インスタンスをデータベースに保存します。
  • book.save() は、Book インスタンスをデータベースに保存します。
  • person.save() は、Person インスタンスをデータベースに保存します。

このコードはほんの一例であり、Models でできることはもっとたくさんあります。詳細は、Django 公式ドキュメントを参照してください。

  • コードを実行するには、Django プロジェクトをセットアップし、適切なデータベースに接続する必要があります。
  • 上記のコードは、Django 4.0 を使用しています。他のバージョンを使用している場合は、コードを適宜変更する必要があります。


カスタムデータベースアダプタ

データベースの種類によっては、Django の標準的な Models では十分な機能を提供できない場合があります。そのような場合は、カスタムデータベースアダプタを開発することで、Models の機能を拡張することができます。

ORM以外のライブラリ

SQLAlchemy や Pony など、Django 以外の ORM(Object Relational Mapper)ライブラリを使用することもできます。これらのライブラリは、Django Models と異なる機能や特性を提供している場合があります。

ローレベルなデータベース操作

データベース操作を直接記述することもできますが、これは複雑でエラーが発生しやすいため、一般的には推奨されていません。

NoSQL データベース

MongoDB や Cassandra などの NoSQL データベースを使用する場合は、Models を使用する必要はありません。NoSQL データベースは、リレーショナルデータベースとは異なるデータ構造をサポートしており、Models では表現できないような柔軟なデータスキーマを定義することができます。

各代替手段の比較

代替手段利点欠点
カスタムデータベースアダプタDjango のフレームワーク内で動作複雑な開発が必要
ORM 以外のライブラリ異なる機能や特性を提供Django との統合が難しい場合がある
ローレベルなデータベース操作柔軟性が高い複雑でエラーが発生しやすい
NoSQL データベース柔軟なデータスキーマリレーショナルデータとの連携が難しい場合がある

代替手段を選択する際の考慮事項

  • 保守性: 将来的にコードを保守しやすいかどうかを考慮する必要があります。
  • 開発者のスキル: カスタムデータベースアダプタや ORM 以外のライブラリの開発には、高度なスキルが必要となります。
  • プロジェクトの要件: プロジェクトで必要なデータ構造と機能を検討する必要があります。

"Models" は、Django においてデータ構造を定義し、操作するための強力なツールですが、必ずしもすべてのケースに最適とは限りません。代替手段を選択する際には、プロジェクトの要件、開発者のスキル、保守性などを考慮する必要があります。