11

メッセージを送信していますが、いつ、誰に、どのメッセージが送信されたかを追跡する必要があります。

そのため、メッセージの他に追加のテーブル モデルに受信者がいて、新しいメッセージを作成するたびに受信者を入力する必要があります。メッセージのRecipientは、送信先の現在のすべての電子メール アドレスを含む 3 番目のモデルから入力されます。

だから私の質問は、これを最も効率的な方法で行うにはどうすればよいですか?
私は次のようなことができることを知っています:

m = Message.objects.create(*args)
for email in ModelWithEmails.active.values_list('email', flat=True):
    Recipient.objects.create(message=m, email=email)

しかし、それにはデータベースからすべての電子メール アドレスを取得する必要があり、可能であればデータベース内にすべて保持したいと考えています。毎回数千のアドレスが取得されるからです。

4

2 に答える 2

12

django ORM で INSERT .. SELECT を実行することはできませんが、一括挿入を行うことはできます (django 1.4 以降):

m = Message.objects.create(*args)
recipients = []
for email in ModelWithEmails.active.values_list('email', flat=True):
    recipients.append(Recipient(message=m, email=email))

Recipient.objects.bulk_create(recipients)

  または、もう少し効率的です。

m = Message.objects.create(*args)
emails = ModelWithEmails.active.values_list('email', flat=True)
Recipient.objects.bulk_create([Recipient(message=m, email=email) for email in emails])

 

INSERT .. SELECT の場合は、生の SQL にフォールバックする必要があります。

于 2012-12-30T10:42:30.453 に答える
1

Django ORM では、ユーザーが生の SQL を使用する必要がなくなりました。とても便利ですが、あまり柔軟ではないかもしれません。ORM を使いたい場合は、Pavel Anossov が言ったように、bulk_create が友達になります。

于 2012-12-30T12:25:37.747 に答える