2010-11-18 8 views
30

Djangoのオンラインドキュメントでこのトピックについて何も見たことがありません。Djangoのバッチ保存オブジェクトについての質問

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

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

+0

おそらく、bulk_create()がdjango 1.4以降で利用できるようになりました。 – DMTintner

答えて

10

残念ながら、バッチインサートは、Django 1.3以前が直接サポートしていないものです。 ORMを使用する場合は、個々のオブジェクトごとにsave()を呼び出す必要があります。大きなリストでパフォーマンスが問題になっている場合は、django.db.cursorを使用してトランザクション内でアイテムを手動でINSERTして、プロセスを大幅に高速化できます。巨大なデータセットをお持ちの場合は、PostgresのCOPY FROMなどのデータベースエンジン固有のメソッドを調べる必要があります。

+3

はdjango 1.5でこれでも当てはまりますか? – maazza

+6

いいえ - 下記の答えを参照してください。 1.4以降、bulk_create()は効率的なバルクデータの挿入を処理します。 (https://docs.djangoproject.com/en/1.5/ref/models/querysets/#bulk-create) –

+1

コピー元はbulk_createよりはるかに優れていますか? – sharafjaffri

1

Thisが良い出発点かもしれませんが、コードスニペットの作成者によれば、プロダクションが準備できていない可能性があります。

35

Django 1.4以降、クエリーセットオブジェクトにはbulk_create()メソッドが存在します。これにより、単一のクエリーにオブジェクトのリストを挿入することができます。詳細情報については、以下を参照してください。Djangoの1.4から

+0

非常に良い! 1.4にアップグレードする必要があります。 – netvope

+0

bulk_createは素晴らしいですが、残念ながら継承されたモデルをサポートしていません。それを扱う考えはありますか? –

+0

特に、[モデルの主キーがAutoFieldの場合、save()のようにプライマリキー属性を取得および設定しない場合、データベースバックエンドがサポートしていない限り(現在はPostgreSQL)](https:// docs。 djangoproject.com/ja/dev/ref/models/querysets/#bulk-create)」を参照してください。 – Ninjakannon

2

は常にしかし、bulk_create()が存在するが、。

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

ジャンゴドキュメントは、あなたが使用することはできません(私の場合のように)、saveメソッドをオーバーライドしている場合

モデルのsave()メソッドは、だから、

と呼ばれることはありません言うようにbulk_create。