Блокировка уровня строки Django для форм моделей

Я использую Python 3.5, Django 1.8 и PostgreSql 9.4.

Итак, у меня есть один метод редактирования, в котором в запросе на получение я отображаю форму, и когда пользователь отправляет форму, она будет обновлена. Ее код

def edit_case(request, case_id):
    case = get_object_or_404(Case, pk=case_id)
    if request.method == 'POST':
        data = request.POST.copy()
        form = CaseEditForm(data, instance=case)
        if form.is_valid():
            res = form.save()
            return HttpResponseRedirect(reverse("case_list"))
    else:
        form = CaseEditForm(instance=case)
    variables = RequestContext(request, {
        "form": form,
    })
    return render_to_response(
        'sample/edit_case.html',
        variables,
    )

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

Я знаю о select_for_update, но понятия не имею, как это будет реализовано в случае form.save()

Любая помощь могла бы быть полезна


person Arjun Thakur    schedule 16.11.2016    source источник


Ответы (1)


После стольких исследований я нашел решение. Итак, теперь, когда я получаю запрос для идентификатора, я использую «select_for_update», что-то вроде этого

with transaction.atomic():
    case = get_object_or_404(Case.objects.select_for_update(), pk=case_id)
    form = CaseEditForm(data, instance=case)
        if form.is_valid():
            res = form.save()
            return HttpResponseRedirect(reverse("case_list"))

Итак, как вы можете видеть сейчас, я извлекаю объект набора запросов в рамках транзакции, и если во время транзакции возникает какое-либо исключение, оно автоматически откатывается, а также, поскольку я использую select_for_update, поэтому он будет блокировать строку до тех пор, пока транзакция не завершится успешно или неудачно.

Если у кого-то есть лучшее предложение, пожалуйста, поделитесь им.

person Arjun Thakur    schedule 25.11.2016