web-dev-qa-db-ja.com

Djangoのオブジェクトのバッチ保存に関する質問

Djangoのオンラインドキュメントでは、このトピックに関することは何も見ていません。

オブジェクトのリストをデータベースに保存しようとしていますが、リストをループしてすべてのオブジェクトでsave()を呼び出すことができます。

それで、Djangoデータベースに数回ヒットしますか?またはDjangoは代わりに1つのバッチ保存を行いますか?

32
zs2020

残念ながら、バッチ挿入はDjango 1.3以前では直接サポートされていません。ORMを使用する場合は、個々のオブジェクトごとにsave()を呼び出す必要があります。大きなリストとパフォーマンスが問題になる場合は、Django.db.cursorを使用してトランザクション内にアイテムを手動で挿入し、プロセスを劇的にスピードアップできます。巨大なデータセットがある場合は、データベースエンジン固有のメソッドを検討する必要があります。 PostgresのCOPYFROM。

10
Brandon Konkle

Django 1.4の時点で、QuerySetオブジェクトにbulk_create()メソッドがあり、単一のクエリにオブジェクトのリストを挿入できます。詳細については、以下を参照してください。

35
Gary

From Django 1.4はbulk_create()が存在しますが、常にですが。

bulk_create()を使用すると、インスタンスsave()メソッドが内部的に呼び出されないので注意が必要です。

Django docsによると

モデルのsave()メソッドは呼び出されません

したがって、saveメソッドをオーバーライドする場合、(私の場合のように)bulk_createを使用することはできません。

3
levi

この質問は Djangoでバッチ挿入を実行するにはどうすればよいですか? でも扱われます。これはDjangoこれを行うためのいくつかの方法を提供します。

This は良い出発点かもしれませんが、コードスニペットの作成者が言うように、本番環境に対応していない可能性があります。

1