2016-11-24 156 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