ORM

Django ORMとは|初心者向けにデータベース操作の基本を解説

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内で使用するモデルをインポートします。

views.py
from .models import Company, Person

上の例では、同じアプリフォルダにあるmodels.pyCompanyPersonモデルを読み込んでいます。

簡単な使用例

views.pyで全データを取得してテンプレートに渡す基本的な例です。

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
    })
実行結果(発行されるSQL)
SELECT * FROM company;

Company.objects.all()というPythonコードが、自動的にSQLのSELECT * FROM companyに変換されて実行されます。

データの取得方法

Djangoでは様々な方法でデータベースからデータを取得できます。

views.py
# 全てのデータを取得
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]

データの作成と更新

新しいデータの作成と既存データの更新方法です。

views.py
# 新しいオブジェクトの作成(方法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_savepost_saveシグナルは発火しません。シグナルを使っている場合は個別にsave()する必要があります。

データの削除

データベースからオブジェクトを削除する方法です。

views.py
# 単一オブジェクトの削除
item = MyModel.objects.get(id=1)
item.delete()

# 複数オブジェクトの一括削除
MyModel.objects.filter(field1="value").delete()

条件の指定方法

より複雑なデータ検索のための条件指定方法です。

views.py
# 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'))

集計関数

データの集計を行う方法です。

views.py
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を使用する際のパフォーマンス最適化のポイントです。

views.py
# 必要なフィールドのみ取得(メモリ節約)
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問題を回避する