Объект не существует в БД после последовательных вызовов
У меня есть следующий поток для создания объекта: Пользователь хочет создать объект на веб-сервисе. Для того, чтобы сделать это - я проверяю, имеет ли пользователь право платить за это плату.
- 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.
- User fills in data and in the second case presses the PayPal button.
- We make 2 consequential API requests:
- Create an object with the parameter is_draft=True. Return its id.
- Create an order object and use the id from the previous step.
- 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 к заказу