Объект не существует в БД после последовательных вызовов

У меня есть следующий поток для создания объекта: Пользователь хочет создать объект на веб-сервисе. Для того, чтобы сделать это - я проверяю, имеет ли пользователь право платить за это плату.

  1. We make a request to know how much the user should pay. If 0 - user will see the regular Create button, if >0 he will see the PayPal button.
  2. User fills in data and in the second case presses the PayPal button.
  3. We make 2 consequential API requests:
  1. Create an object with the parameter is_draft=True. Return its id.
  2. Create an order object and use the id from the previous step.
  1. Sometimes we cannot create an order, because the object doesn't exist in DB yet.

Настройка Django:

DATABASES["default"]["ATOMIC_REQUESTS"] = True

Django models:

class Object1(models.Model):
   name = models.CharField()
   ...

class Object2(models.Model):
   name = models.CharField()
   ...

class Order(models.Model):
   user = models.ForeignKey(User)
   amount = models.DecimalField()

   #naive polymorphism
   object1 = models.ForeignKey(Object1)
   object2 = models.ForeignKey(Object2)

# An object will be created after PayPal's call to the webhook endpoint
class OrderPayment(models.Model):
   ...
   order = models.ForeignKey(Order)

Проблема в том, что я не могу вызвать transaction.commit() после создания любого объекта (Object1 или Object2), потому что я использую атомарный запрос, и это приводит к ошибке:

django.db.transaction.TransactionManagementError: This is forbidden when an 'atomic' block is active.

Как обеспечить существование объектов в БД?

Поскольку вы выполняете пост внутри атомарного запроса, вы можете просто

сохранить заказ -> сохранить объект1 и объект2 -> добавить объект1 и объект2 к заказу

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