Как сохранить несколько моделей Django в одной транзакции?

На мой взгляд, я сохраняю данные в нескольких моделях:

def myview(request):
    #do some processing
    model1.save()
    model2.save()

Как мне обеспечить откат model1.save() в случае, если model2.save() выдает ошибку? Или как сделать коммит только после успешного сохранения обеих моделей?

Другими словами, "только сохраните model1 и model2, если оба save() успешны", или "выполните оба сохранения внутри транзакции".

Ответ 1

Используйте атомную транзакцию :

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

Примеры:

from django.db import transaction

with transaction.atomic():
    model1.save()
    model2.save()

и

from django.db import transaction

try:
    with transaction.atomic():
        model1.save()
        model2.save()
except IntegrityError:
    handle_exception()