Django ORMとは、Pythonのコードを書くだけでSQLを自動生成し、データベースを操作できる機能です。SQLを直接書かなくてもデータの取得・作成・更新・削除ができるため、開発効率が大幅に向上します。
ORMとは
ORM(Object-Relational Mapping)とは、DjangoのModelsのメソッドを使用してSQL(データベースで処理を行う言語)を発行する機能です。通常のSQLより簡単に記述することができますが、SQLを直接記入するのに比べて処理速度はわずかに低下します。
メリット: Python構文でデータベース操作ができるため、SQL文を覚える必要がなく、コードの可読性も向上します。また、データベースの種類(SQLite, PostgreSQL, MySQL等)が変わっても、同じPythonコードで動作します。
ORMの実行場所
ORMのコードはviews.pyの関数やクラス内に記入することで、対象のアクセスが行われたときに実行されます。
まず、views.py内で使用するモデルをインポートします。
from .models import Company, Person上の例では、同じアプリフォルダにあるmodels.pyのCompany、Personモデルを読み込んでいます。
簡単な使用例
views.pyで全データを取得してテンプレートに渡す基本的な例です。
from django.shortcuts import render
from .models import Company
def company_list(request):
# 全ての会社データを取得
companies = Company.objects.all()
# テンプレートにデータを渡す
return render(request, 'companies/list.html', {
'companies': companies
})SELECT * FROM company;Company.objects.all()というPythonコードが、自動的にSQLのSELECT * FROM companyに変換されて実行されます。
データの取得方法
Djangoでは様々な方法でデータベースからデータを取得できます。
# 全てのデータを取得
all_items = MyModel.objects.all()
# 条件に合うデータを取得
filtered = MyModel.objects.filter(field_name="value")
# 単一のオブジェクトを取得(存在しない場合はエラー)
single = MyModel.objects.get(id=1)
# 並び替え(昇順・降順)
ordered = MyModel.objects.order_by('field_name')
ordered_desc = MyModel.objects.order_by('-field_name')
# 件数制限(最初の5件)
limited = MyModel.objects.all()[:5]データの作成と更新
新しいデータの作成と既存データの更新方法です。
# 新しいオブジェクトの作成(方法1: create)
new_item = MyModel.objects.create(field1="value1", field2="value2")
# 新しいオブジェクトの作成(方法2: インスタンス作成 + save)
new_item = MyModel(field1="value1", field2="value2")
new_item.save()
# 既存オブジェクトの更新
item = MyModel.objects.get(id=1)
item.field1 = "new value"
item.save()
# 複数オブジェクトの一括更新
MyModel.objects.filter(field1="old").update(field1="new")update()メソッドはモデルのsave()メソッドを呼び出さないため、pre_saveやpost_saveシグナルは発火しません。シグナルを使っている場合は個別にsave()する必要があります。
データの削除
データベースからオブジェクトを削除する方法です。
# 単一オブジェクトの削除
item = MyModel.objects.get(id=1)
item.delete()
# 複数オブジェクトの一括削除
MyModel.objects.filter(field1="value").delete()条件の指定方法
より複雑なデータ検索のための条件指定方法です。
# AND条件(複数の条件すべてに一致)
MyModel.objects.filter(field1="value1", field2="value2")
# OR条件(いずれかの条件に一致)
from django.db.models import Q
MyModel.objects.filter(Q(field1="value1") | Q(field2="value2"))
# NOT条件(条件に一致しない)
MyModel.objects.filter(~Q(field1="value1"))
# 大小比較
MyModel.objects.filter(field1__gt=10) # 10より大きい
MyModel.objects.filter(field1__gte=10) # 10以上
MyModel.objects.filter(field1__lt=10) # 10未満
MyModel.objects.filter(field1__lte=10) # 10以下
# フィールド同士の比較
from django.db.models import F
MyModel.objects.filter(field1__gt=F('field2'))集計関数
データの集計を行う方法です。
from django.db.models import Count, Sum, Avg, Min, Max
# カウント
count = MyModel.objects.count()
# グループ化してカウント
group_counts = MyModel.objects.values('category').annotate(
count=Count('id')
)
# 合計・平均・最小・最大
result = MyModel.objects.aggregate(
total=Sum('amount'),
average=Avg('amount'),
minimum=Min('amount'),
maximum=Max('amount')
)ORMの処理の流れ
Django ORMを使ったデータベース操作は以下の流れで行います。
1. models.py でテーブル構造を定義
↓
2. makemigrations / migrate でDBに反映
↓
3. views.py でORMを使ってデータ操作
↓
4. テンプレートにデータを渡して表示パフォーマンスの最適化
ORMを使用する際のパフォーマンス最適化のポイントです。
# 必要なフィールドのみ取得(メモリ節約)
MyModel.objects.values('id', 'name')
# ForeignKeyの事前読み込み(N+1問題の回避)
Article.objects.select_related('author').all()
# ManyToManyフィールドの事前読み込み
Article.objects.prefetch_related('tags').all()大規模なデータを扱う場合は、select_related()やprefetch_related()を使ってN+1問題を回避しましょう。また、values()で必要なフィールドだけを取得するとメモリ使用量を削減できます。
まとめ
- ORMを使うとPythonコードでデータベース操作ができる(SQLの自動生成)
objects.all()で全件取得、filter()で条件付き取得ができるcreate()でデータ作成、save()で更新、delete()で削除QオブジェクトでOR条件、Fオブジェクトでフィールド参照が可能aggregate()やannotate()で集計処理ができるselect_related()とprefetch_related()でN+1問題を回避する