Как я могу откатить REST API-взаимодействия в Django Rest Framework? - PullRequest
0 голосов
/ 07 июня 2019

Я работаю над проектом, в котором несколько конечных точек REST попадают на сервер Django из веб-клиента для создания данных. Если есть ошибка, иногда мы хотим удалить ранее созданные данные.

Например, если я создаю автомобиль с помощью POST /cars/ и хочу создать колеса через отдельную конечную точку с помощью POST /wheels/ { "car": 1 } Я хочу удалить автомобиль, если я не смог добавить какие-либо колеса.

Создание конечных точек, которые выполняют все действия, которые мы можем откатить сразу (вместо того, чтобы использовать несколько конечных точек), потребует большого количества рефакторинга и на самом деле не вариант.

Что бы нам действительно понравилось, так это какой-то способ сделать что-то вроде этого:

POST /transaction/start
POST /cars/
POST /wheels/ { "car": 1 }
POST /transaction/end

Мы открываем транзакцию, присоединяем ее к сеансу пользователя, добавляем данные в эту транзакцию, затем закрываем транзакцию либо при достижении POST /transaction/end, либо по истечении времени ожидания.

У меня есть два основных вопроса по этому поводу:

  1. Существуют ли какие-либо пакеты, которые делают это / это приемлемый шаблон? Я провел небольшое исследование и не увидел ничего специфического для django, но раньше видел конечные точки транзакции.
  2. Это серьезно блокирует базу данных? Области, где мы хотели бы сделать это, не так часто встречаются, так что это не такая уж большая проблема, но было бы неплохо знать.

Я немного покопался в @transaction.atomic, и кажется, что это возможно, но мне пока не удалось это сделать. Я не уверен, имеет ли это значение, но мы используем postgres за кулисами. Любые советы будут оценены. Спасибо.

...