带有相关对象的 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()
.
的数千次调用
如何批量创建数千个相关模型,以便维持关系并以最有效的方式使用数据库?
备注:
- 我正在寻找适用于所有数据库(SQLite 可能除外)的本机 Django 解决方案。
- 我的系统 运行s 在 celery 任务中计费以将长 运行ning 代码与活动请求分离,但我仍然关心完成计费周期需要多长时间。
- 该解决方案应假设其他请求或 运行ning 任务也在读取和写入相关表。
您可以 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)
我有一个 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()
.
如何批量创建数千个相关模型,以便维持关系并以最有效的方式使用数据库?
备注:
- 我正在寻找适用于所有数据库(SQLite 可能除外)的本机 Django 解决方案。
- 我的系统 运行s 在 celery 任务中计费以将长 运行ning 代码与活动请求分离,但我仍然关心完成计费周期需要多长时间。
- 该解决方案应假设其他请求或 运行ning 任务也在读取和写入相关表。
您可以 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)