У меня есть следующее представление:
def directions_import_view(request):
""" Import directions from family ambulance """
form = ImportDirectionsForm()
if request.method == "POST":
form = ImportDirectionsForm(request.POST, request.FILES)
if form.is_valid():
sid = transaction.savepoint()
try:
# parse patients
parsed_patients = parse_foreign_patients_by_doc(request.FILES['file'])
# save patient and direction to db
for foreign_patient in parsed_patients:
created_patient = foreign_patient.save_patient_to_local_db()
analysis_name = LabAnalysisTypeModelHelper.get_name_by_type(
form.cleaned_data.get('to_analysis'))
direction = Direction(
serial_no=created_patient.number_card,
who_send='ЦПМСД №1',
who_is_doctor=foreign_patient.doctor,
analysis_type=form.cleaned_data.get('to_analysis'),
analysis_name=analysis_name,
date=form.cleaned_data.get('date'),
patient=created_patient
)
direction.save()
messages.add_message(request, messages.INFO, 'Створено ' + str(len(
parsed_patients)) + ' направлень на ' + analysis_name)
return redirect(reverse('direction_list'))
except Exception as e:
print('exception is occured')
transaction.rollback()
transaction.savepoint_rollback(sid)
return render(request, template_name='error.html',
context={'error_messages': [str(e)]})
return render(request, 'directions/import_directions.html', {'form': form})
parsed_patients = parse_foreign_patients_by_doc(request.FILES['file'])
имеет цикл в нем и его строки таблицы анализа docx, если ячейка таблицы для имени пациента отформатирована неправильно, она выдает исключение.
У меня есть docx с 20 строками таблицы, 15 из них в порядке, но другие нет. Таким образом, это исключение.
Когда возникло исключение, представление обрабатывает его, но транзакция не выполняется, 15 из 20 пациентов сохраняются в базе данных.
PS Я использую sqlite.