ORM

Django ORMでデータの作成|save()とcreate()の使い方

DjangoのORMでは、モデルのインスタンスを作成してsave()メソッドを呼び出すか、objects.create()を使うことでデータベースに新しいレコードを追加できます。ここでは、データ作成の基本的な方法と実践的なパターンを解説します。

基本的な使い方

Step 1save()メソッドでデータを作成する

最も基本的な方法は、モデルのインスタンスを作成してからsave()を呼び出す方法です。

views.py
from .models import Company

# インスタンスを作成してsave()で保存
company = Company(name='テスト株式会社')
company.save()

この方法では、まずPythonオブジェクトとしてインスタンスが作成され、save()が呼ばれた時点でデータベースにINSERTクエリが発行されます。保存前にインスタンスの属性を変更できるため、柔軟な処理が可能です。

Step 2objects.create()でデータを作成する

create()メソッドを使うと、インスタンスの作成と保存を1行で行えます。

views.py
from .models import Company

# create()で作成と保存を同時に行う
company = Company.objects.create(
    name='テスト株式会社',
    address='東京都渋谷区',
    phone='03-1234-5678'
)

create()は内部的にsave()を呼び出しているため、動作としては同じですが、コードが簡潔になります。作成されたインスタンスが戻り値として返されるため、そのまま変数に代入して使用できます。

Step 3複数フィールドのデータ保存

複数のフィールドに値を設定する場合は、キーワード引数で指定します。

views.py
from .models import Company

# save()を使う場合
company = Company(
    name='テスト株式会社',
    address='東京都渋谷区',
    phone='03-1234-5678',
    email='info@test.co.jp'
)
company.save()

# 保存後にIDが自動的に設定される
print(company.id)  # 例: 1

Djangoのモデルでは、主キー(idフィールド)は自動的に生成されるため、明示的に指定する必要はありません。

Step 4一括作成:bulk_create()

大量のデータを一度に作成する場合は、bulk_create()を使うとパフォーマンスが向上します。

views.py
from .models import Company

# 複数のインスタンスをリストで作成
companies = [
    Company(name='会社A', address='東京都'),
    Company(name='会社B', address='大阪府'),
    Company(name='会社C', address='福岡県'),
]

# 一括保存(1回のSQLで挿入)
Company.objects.bulk_create(companies)

bulk_create()は1回のSQLクエリで複数レコードを挿入するため、ループで個別にsave()するよりも大幅に高速です。ただし、save()メソッドのカスタム処理やシグナルは実行されない点に注意してください。

注意

bulk_create()では、モデルのsave()メソッドに記述したカスタム処理(バリデーションなど)は実行されません。また、auto_now_add=Trueのフィールドは正しく設定されますが、pre_savepost_saveシグナルは発火しません。

Step 5get_or_create():取得または作成

データが存在する場合は取得し、存在しない場合は新規作成するget_or_create()もよく使われます。

views.py
from .models import Company

# 存在すれば取得、なければ作成
company, created = Company.objects.get_or_create(
    name='テスト株式会社',
    defaults={
        'address': '東京都渋谷区',
        'phone': '03-1234-5678'
    }
)

if created:
    print('新規作成されました')
else:
    print('既存のデータを取得しました')

戻り値はタプルで、1つ目がインスタンス、2つ目が新規作成されたかどうかの真偽値です。defaultsに指定した値は、新規作成時にのみ使用されます。

save()とcreate()の使い分け
  • save() — 保存前にインスタンスの属性を操作したい場合や、更新処理と兼用したい場合に使う
  • create() — シンプルにデータを作成する場合に使う(コードが簡潔)
  • bulk_create() — 大量データの一括作成でパフォーマンスを重視する場合に使う
  • get_or_create() — 重複を避けて、なければ作成したい場合に使う

まとめ

  • モデル名(フィールド=値).save()でデータを作成・保存できる
  • objects.create()で作成と保存を1行で実行できる
  • bulk_create()で大量データを効率的に一括作成できる
  • get_or_create()で「なければ作成」の処理を簡潔に書ける
  • 主キー(id)は自動生成されるため、明示的に指定する必要はない