我正在发送消息,我需要跟踪发送的每封邮件,时间,对象等。
因此,除了邮件之外,我还有一个额外的表模型中的收件人,每次创建新邮件时我都需要填充收件人。将从第三个模型填充消息的Recipient
,该模型包含我要发送到的所有当前电子邮件地址。
所以我的问题是如何以最有效的方式解决这个问题? 我知道我可以做类似的事情:
m = Message.objects.create(*args)
for email in ModelWithEmails.active.values_list('email', flat=True):
Recipient.objects.create(message=m, email=email)
但这仍然需要将所有电子邮件地址从数据库中取出,如果可能的话,我希望将其全部保存在数据库中,因为每次都会有几千个地址被提取。
答案 0 :(得分:5)
你不能用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。
答案 1 :(得分:1)
Django ORM不再需要用户使用原始sql。它非常方便,但可能不是很灵活。 如果您想使用ORM,bulk_create将成为您的朋友,就像Pavel Anossov所说的那样。