Как я могу обрабатывать несколько отдельных моделей в одном AJAX-запросе с помощью Django REST Framework?

В моем проекте Django (версия 5.1.2) мне нужно обрабатывать данные из нескольких моделей в одном AJAX-запросе с фронт-энда. Например, у меня есть форма, которая одновременно собирает информацию о пользователе и адреса доставки. Я хочу отправить эти данные в одном запросе и сохранить их в отдельных моделях в базе данных.

Я использую Django REST Framework для управления API, но не знаю, как правильно проверить и сохранить сразу несколько моделей в одном запросе.

В настоящее время я использую один ViewSet для каждой модели, но не знаю, как объединить их в одном AJAX-запросе и гарантировать, что в случае ошибки в одной из моделей ни один из данных не будет сохранен (т. е. мне нужна правильная обработка транзакций).

Есть ли рекомендуемое решение для этого в Django 5.1.2? Каким образом лучше всего обрабатывать несколько моделей в одном AJAX-запросе в Django REST Framework?

Подробности:

Я использую Django 5.1.2. Необходимо транзакционно сохранять информацию о пользователе и адресе.

Что я пробовал:

Я создал два отдельных набора ViewSet для моделей информации о пользователе и адреса доставки. Затем я попытался отправить данные формы через один AJAX POST-запрос с фронт-энда. Я попытался обработать данные в двух разных представлениях, но столкнулся с проблемой их координации. В частности, я хотел использовать сериализаторы Django REST Framework для проверки данных, гарантируя, что если одна из моделей не пройдет проверку, данные ни одной из них не будут сохранены.

То, что я ожидал:

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

Что случилось:

У меня возникли проблемы с управлением транзакциями между двумя ViewSet. Либо данные одной модели сохранялись раньше, чем данные другой, либо ошибки валидации для одной модели не предотвращали должным образом сохранение данных другой модели. Это приводило к непоследовательным состояниям базы данных, в которых хранились частичные данные.

Создайте пользовательскую конечную точку API с комбинированным сериализатором, в который вложены пользовательский и адресный сериализаторы.

Используйте комбинированный сериализатор. Вы можете вложить пользовательский и адресный сериализаторы в один основной сериализатор.

Реализуйте управление транзакциями с помощью transaction.atomic() в представлении, чтобы обе модели сохранялись вместе.

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

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