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

时间:2012-12-30 10:38:56

标签: 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)

但这仍然需要将所有电子邮件地址从数据库中取出,如果可能的话,我希望将其全部保存在数据库中,因为每次都会有几千个地址被提取。

2 个答案:

答案 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所说的那样。