在SQL中创建许多相关的对象,例如INSERT ... SELECT

gaq*_*qzi 6 python django

我正在发送邮件,我需要跟踪每条发送的邮件,发送时间,发送给谁等。

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

所以我的问题是我将如何以最有效的方式实现这一目标?
我知道我可以做类似的事情:

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

但这仍然涉及将所有电子邮件地址从数据库中取出,我想尽可能将其保留在数据库中,因为每次都会提取数千个地址。

Pav*_*sov 6

您无法使用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)
Run Code Online (Sandbox Code Playgroud)

  或更有效一点:

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])
Run Code Online (Sandbox Code Playgroud)

 

对于INSERT .. SELECT,您将不得不使用原始SQL。