私は Inquiry
オブジェクトの大きな(300 +以上の)リストの Activty
オブジェクトを作成しようとしています。 1つの ModelForm
がポストバックされており、別のインスタンスを作成して GenericForeignKey
を介して Inquiry
にアタッチする必要があります。いくつかのコードに行きましょう:
models.py:
class InquiryEntry(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
entry = generic.GenericForeignKey('content_type', 'object_id')
class Inquiry(models.Model):
entries = models.ManyToManyField('InquiryEntry')
# And many more fields.
def add_entry(self, obj):
entry = self.entries.create(entry=obj)
self.save()
return entry
class Activity(models.Model):
ts = models.DateTimeField(auto_now_add=True)
due_date = models.DateField(auto_now=False)
## And many more fields.
views.py:
def bulk_create_activities(request):
activity_form = ActivityForm()
if request.method == "POST":
activity_form = ActivityForm(request.POST)
if activity_form.is_valid():
pks = [int(x) for x in request.POST.get('pks', '').split(',')]
for inquiry in Inquiry.objects.filter(pk__in=pks):
instance = ActivityForm(request.POST).save()
inquiry.add_entry(instance)
inquiry.save()
私が探しているのは、これらをデータベースに挿入する方法です。要求をより速く処理できるように、1回のパスで行うことが望ましいです。このアプリケーションは複数のデータベースベンダーに配備されているため、データベースレベルに落とさないことをお勧めしますが、これが唯一の方法であれば、そうしてください(MySQLとPostgresの例はすばらしいでしょう)。
Note: I know that there is a bulk_create
in the development version, but that is out of the question until there is a stable release.
単純に for
をトランザクション構造で囲んでみましたか?エントリが一括して一度にディスクに書き込まれるため、Commit-on-successトランザクションでは大量のスピードアップが発生する可能性があるため、DBMSは各アイテムの後にfsync()を停止する必要はありません。
Implementing transactions in recent versions of django is snappy, check out https://docs.djangoproject.com/en/dev/topics/db/transactions/#controlling-transaction-management-in-views
Take a look at http://people.iola.dk/olau/python/bulkops.py
これは、単一の照会を実行するinsert_manyおよびupdate_many関数を提供します。著者が指摘したように、Pythonで多対多の関係のpkのマニュアル簿記を行う必要がありますが、一度問題が解決したら、 Inquiry
と > InquiryEntry
。
これは一括処理を効率化するものではありませんが、提出されたデータに基づいて瞬時にお問い合わせ
に返信する必要がない場合(モデル名に基づいていると仮定しています) Celeryのようなタスクキューのための完璧な仕事のように。
ユーザーは超高速応答を得ることができ、セーラーワーカーは余暇でそれを刈り取ることができます。 1.4が安定したら、in_bulk :)をチェックしてください:)
私はまた、データベースにとらわれない岩石の固体メソッドに興味があるだろうが、あなたの状況に応じて、これは許容される解決策かもしれない。
ここで答えを見ています...