Я пытаюсь откатить группу транзакций, если в цикле возникают исключения. Но я не хочу выходить из цикла или генерировать исключение, не перехватив его.
Я не хочу, чтобы бизнес-логика сохранялась, если какой-либо из дочерних элементов в цикле выдает исключение. Это означает, что я не могу поместить транзакцию в цикл, потому что, если какая-либо из них завершится неудачей, транзакция будет отменена только для конкретного дочернего элемента.
parent = Parent.objects.get(pk='something')
exceptions = []
with transaction.atomic():
for child in parent.children.all():
try:
# business logic which also saves other models
# I don't want this saved if there is an exception for any object in the loop
except Exception as e:
exceptions.append({
'id': child.id,
'error': str(e),
})
if len(exceptions) > 0:
transaction.set_rollback(True)
for exception in exceptions:
Child.objects.filter(pk=exception['id']) \
.update(error=exception['error']
# more business logic and raise exception
parent.is_blocked = True
parent.save()
# I don't want this exception to rollback all transactions
raise Exception('Parent {} is blocked'.format(parent.id))
Я получаю сообщение об ошибке с приведенным выше кодом. Сообщение довольно прямое. Я пытаюсь откатить транзакцию вне блока.
django.db.transaction.TransactionManagementError: The rollback flag doesn't work outside of an 'atomic' block.
Кто-нибудь нашел способ справиться с чем-то вроде этого. Я надеюсь, что я просто пропустил что-то простое. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.