Django ORMのデータ追加入門
create・save・bulk_create
Django ORMを使ったデータの追加方法を解説します。create, save, bulk_createの使い分けを紹介します。
こんな人向けの記事です
- Django ORMでデータを追加したい人
- create, save, bulk_createの違いを知りたい人
- ビューからデータを保存する方法を理解したい人
Step 1データ追加の基本
Django ORMでデータを追加する方法は主に3つあります。
| 方法 | 特徴 |
|---|---|
| objects.create() | 1行でインスタンスの作成と保存を同時に行う |
| インスタンス + save() | 保存前にデータの加工や条件分岐ができる |
| objects.bulk_create() | 大量データを一括で効率的に保存する |
Step 2createメソッド
最もシンプルなデータ追加方法です。インスタンスの作成と保存を1行で行います。
from myapp.models import Company
# データを1件追加
company = Company.objects.create(
name="株式会社テスト",
founding_date="2024-08-16"
)
# 戻り値は作成されたインスタンス
print(company.id) # 1(自動採番)
print(company.name) # 株式会社テスト
1
株式会社テスト
ポイント: idフィールドはDjangoが自動的に採番します。データが追加されるたびに1, 2, 3...と連番で割り当てられ、各レコードを一意に識別する主キーとなります。
Step 3インスタンス作成とsave
モデルのインスタンスを先に作成し、後からsave()で保存する方法です。保存前にデータの加工ができます。
from myapp.models import Company
from datetime import date
# インスタンスを作成(まだDBには保存されない)
company = Company(name="株式会社サンプル")
# 後からフィールドを設定
company.founding_date = date.today()
# データベースに保存
company.save()
print(company.id) # 保存後にidが設定される
この方法は、保存前にバリデーションを実行したり、条件に応じて値を変更したい場合に便利です。
# バリデーションの実行例
company = Company(name="")
try:
company.full_clean() # バリデーションを実行
company.save()
except ValidationError as e:
print(e.message_dict) # エラー内容を表示
注意: save()はデフォルトではバリデーションを実行しません。明示的にバリデーションを行いたい場合は、full_clean()を呼び出してからsave()を実行してください。
Step 4bulk_createで一括追加
大量のデータを追加する場合はbulk_createが効率的です。1回のSQLクエリで複数のレコードを挿入します。
from myapp.models import Company
companies = [
Company(name="会社A", founding_date="2020-01-01"),
Company(name="会社B", founding_date="2021-06-15"),
Company(name="会社C", founding_date="2022-03-10"),
Company(name="会社D", founding_date="2023-09-20"),
]
# 一括で保存(1回のSQLクエリで実行)
Company.objects.bulk_create(companies)
注意: bulk_createではsave()メソッドは呼び出されず、シグナル(pre_save, post_save)も発火しません。また、バリデーションも実行されないため、データの整合性は事前に確認してください。
Step 5ビューからデータを保存する
実際のWebアプリケーションでは、フォームから送信されたデータをビューで保存します。
from django.shortcuts import render, redirect
from .models import Company
class CompanyCreateView(View):
def get(self, request):
return render(request, "myapp/company_form.html")
def post(self, request):
name = request.POST.get("name")
founding_date = request.POST.get("founding_date")
Company.objects.create(
name=name,
founding_date=founding_date
)
return redirect("myapp:company_list")
ポイント: 実際の開発では、DjangoのFormクラスやModelFormを使ってバリデーションとデータ保存を行うのが一般的です。直接request.POSTから取得する方法はセキュリティリスクがあるため、必ずバリデーションを行いましょう。
Step 6関連データの追加
ForeignKeyで関連するモデルのデータを追加する方法です。
from myapp.models import Company, Employee
# 会社を作成
company = Company.objects.create(name="株式会社テスト")
# 方法1: ForeignKeyにインスタンスを渡す
Employee.objects.create(
name="田中太郎",
age=30,
company=company
)
# 方法2: ForeignKeyのIDを直接指定
Employee.objects.create(
name="佐藤花子",
age=25,
company_id=company.id
)
# 方法3: related_nameを使って親から作成
company.employees.create(
name="鈴木一郎",
age=35
)
方法3のようにrelated_nameを使って親モデルから子データを作成すると、外部キーが自動的に設定されるため、コードがシンプルになります。
まとめ
objects.create()でインスタンスの作成と保存を1行で行えるModel() + save()で保存前にデータの加工ができるbulk_create()で大量データを効率的に一括保存できるid(主キー)はDjangoが自動的に連番で採番するsave()はバリデーションを自動実行しないため、必要に応じてfull_clean()を呼ぶ- 関連データの追加には、インスタンス指定・ID直接指定・related_nameの3つの方法がある