带有相关对象的 Django `bulk_create`

Django `bulk_create` with related objects

我有一个 Django 系统,运行 定期为成千上万的客户计费。这是我的模型:

class Invoice(models.Model):
    balance = models.DecimalField(
        max_digits=6,
        decimal_places=2,
    )

class Transaction(models.Model):
    amount = models.DecimalField(
        max_digits=6,
        decimal_places=2,
    )
    invoice = models.ForeignKey(
        Invoice,
        on_delete=models.CASCADE,
        related_name='invoices',
        null=False
    )

当计费是 运行 时,使用多个嵌套的 for 循环创建数千张包含数十笔交易的发票,这会触发对每个创建的记录的插入。我可以 运行 bulk_create() 处理每张发票的交易,但这仍然会导致对 bulk_create().

的数千次调用

如何批量创建数千个相关模型,以便维持关系并以最有效的方式使用数据库?

备注:

您可以 bulk_create 所有 Invoice 对象,从数据库中刷新它们,以便它们都有 ID,为所有发票创建 Transaction 对象,然后保存他们 bulk_create。所有这些都可以在单个 transaction.atomic 上下文中完成。

另外,专门针对 django 1.10 和 postrgres,看看这个 answer

您可以通过以下方法使用两个批量创建查询来完成。

new_invoices = []
new_transactions = []
for loop:
    invoice = Invoice(params)
    new_invoices.append(invoice)

    for loop: 
        transaction = Transaction(params)
        transaction.invoice = invoice
        new_transactions.append(transaction)

Invoice.objects.bulk_create(new_invoices)

for each in new_transactions:
    each.invoice_id = each.invoice.id

Transaction.objects.bulk_create(new_transactions)