ORM

Django ORMのデータ追加入門|create・save・bulk_create

Django ORM データ追加

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行で行います。

Python
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()で保存する方法です。保存前にデータの加工ができます。

Python
from myapp.models import Company
from datetime import date

# インスタンスを作成(まだDBには保存されない)
company = Company(name="株式会社サンプル")

# 後からフィールドを設定
company.founding_date = date.today()

# データベースに保存
company.save()

print(company.id)  # 保存後にidが設定される

この方法は、保存前にバリデーションを実行したり、条件に応じて値を変更したい場合に便利です。

Python
# バリデーションの実行例
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クエリで複数のレコードを挿入します。

Python
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アプリケーションでは、フォームから送信されたデータをビューで保存します。

views.py
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で関連するモデルのデータを追加する方法です。

Python
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つの方法がある