2016-11-24 5 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).
  • Моя система запускает биллинг в задании на сельдерей, чтобы отделить длительный код от активных запросов, но я все еще беспокоюсь о том, сколько времени требуется для завершения цикла выставления счетов.
  • Решение должно предполагать, что другие запросы или выполняемые задачи также считываются и записываются в соответствующие таблицы.

ответ

2

Вы можете bulk_create все Invoice объекты, обновить их из БД, так что все они имеют идентификаторы, создать Transaction объекты для всех счетов-фактур, а затем и сохранить их с bulk_create. Все это можно сделать в одном контексте transaction.atomic.

Также, для django 1.10 и postrgres, посмотрите на это answer.

 Смежные вопросы

  • Нет связанных вопросов^_^