Djangoのオンラインドキュメントでは、このトピックに関することは何も見ていません。
オブジェクトのリストをデータベースに保存しようとしていますが、リストをループしてすべてのオブジェクトでsave()を呼び出すことができます。
それで、Djangoデータベースに数回ヒットしますか?またはDjangoは代わりに1つのバッチ保存を行いますか?
残念ながら、バッチ挿入はDjango 1.3以前では直接サポートされていません。ORMを使用する場合は、個々のオブジェクトごとにsave()を呼び出す必要があります。大きなリストとパフォーマンスが問題になる場合は、Django.db.cursorを使用してトランザクション内にアイテムを手動で挿入し、プロセスを劇的にスピードアップできます。巨大なデータセットがある場合は、データベースエンジン固有のメソッドを検討する必要があります。 PostgresのCOPYFROM。
Django 1.4の時点で、QuerySetオブジェクトにbulk_create()
メソッドがあり、単一のクエリにオブジェクトのリストを挿入できます。詳細については、以下を参照してください。
From Django 1.4はbulk_create()
が存在しますが、常にですが。
bulk_create()
を使用すると、インスタンスsave()
メソッドが内部的に呼び出されないので注意が必要です。
Django docsによると
モデルのsave()メソッドは呼び出されません
したがって、saveメソッドをオーバーライドする場合、(私の場合のように)bulk_createを使用することはできません。
この質問は Djangoでバッチ挿入を実行するにはどうすればよいですか? でも扱われます。これはDjangoこれを行うためのいくつかの方法を提供します。
This は良い出発点かもしれませんが、コードスニペットの作成者が言うように、本番環境に対応していない可能性があります。