2016-11-24 157 views
2

我有一个Django系统,可以定期为数千个客户运行计费。这里是我的模型:Django`bulk_create`与相关对象

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()的电话。

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

注:

  • 我正在寻找一个本地Django的解决方案,能够对所有数据库的工作(使用SQLite的可能是个例外)。
  • 我的系统在celery任务中运行计费以将长期运行的代码与活动请求分离,但我仍然关心完成计费周期需要多长时间。
  • 该解决方案应该假定其他请求或正在运行的任务也正在读取和写入有问题的表。

回答

2

你可以bulk_create所有Invoice对象,从数据库中刷新了他们,让他们都有标识,为所有的发票Transaction对象,然后还保存这些bulk_create。所有这些都可以在单个transaction.atomic上下文中完成。

此外,专门为django 1.10和postrgres,看看这个answer