11

我正在发送消息,我需要跟踪发送的每条消息、发送时间、发送给谁等。

因此,除了消息之外,我还有一个额外的表模型中的收件人,并且每次创建新消息时都需要填充收件人。消息的Recipient将从第三个模型中填充,其中包含我要发送到的所有当前电子邮件地址。

所以我的问题是我将如何以最有效的方式进行?
我知道我可以做类似的事情:

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,bulk_create 将成为您的朋友,正如 Pavel Anossov 所说。

于 2012-12-30T12:25:37.747 回答