Django транзакция не откатывается при возникновении исключения - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть следующее представление:

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.

1 Ответ

0 голосов
/ 04 февраля 2020

Рекомендую использовать атоми c транзакции Documentation_link

    from django.db import transaction

    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():
                with transaction.atomic():
                    # rest of your code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...