Обработка запросов на бэкенде (Django)

У меня есть две конечные точки api
1- stockpurchases/ || stockpurchases/{id}/
2- stockpurchases/{id}/stocks/ || stockpurchases/{id}/stocks/{id}/

Итак, если кто-то хочет купить, он должен сначала создать складскую закупку, а затем добавить в нее акции. и когда кто-то ПОСТАВЛЯЕТ запас, я плюсую количество и сумму закупки.

Проблема в том, что если кто-то будет последовательно вызывать POST запрос в цикле, то операция с суммой пройдет некорректно.

Я хочу обрабатывать несколько запросов на бэкенде. Например, если сервер получает последовательные запросы на выполнение операции, как я могу заставить другие запросы ждать завершения первой процедуры. После этого обрабатывается второй запрос и т.д.

Модель покупки акций

class StockPurchase(models.Model):
    qty = models.IntegerField(default=0)
    amount = models.IntegerField(default=0)

Модель склада

class Stock(models.Model):
    stockpurchase = models.ForeignKey("StockPurchase", on_delete=models.CASCADE, related_name='stocks')
    product = models.ForeignKey("Product", on_delete=models.CASCADE, related_name='stocks')
    project = models.ForeignKey("Project", on_delete=models.CASCADE, related_name='stocks')

    rate = models.IntegerField()

     def save(self, *args, **kwargs):
        if not self.pk:
            self.stockpurchase.amount += self.rate
            self.stockpurchase.qty += 1
            self.stockpurchase.save()
        super().save()

Так что если я буду звонить так с ожиданием без проблем

async function create() {
  for (let i = 0; i < 10; i++) {
    let response = await fetch(
      "http://localhost:8000/api/stockpurchases/2/stocks/",
      {
        method: "POST",
        body: bodyContent,
        headers: headersList,
      }
    );
  }
}

но если вызвать его без await async функции, то сумма покупки акций будет неправильной вот так

for (let i = 0; i < 10; i++) {
  let response = fetch("http://localhost:8000/api/stockpurchases/2/stocks/", {
    method: "POST",
    body: bodyContent,
    headers: headersList,
  });
}

Вернуться на верх