我正在发送邮件,我需要跟踪每条发送的邮件,发送时间,发送给谁等。
因此,除了邮件之外,我还具有其他表格模型中的收件人,并且每次创建新邮件时都需要填充收件人。该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)
但这仍然涉及将所有电子邮件地址从数据库中取出,我想尽可能将其保留在数据库中,因为每次都会提取数千个地址。
您无法使用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。