模型表单的 Django 行级锁定

Django Row Level Locking For Model Forms

我正在使用 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()

的情况下它将如何实施

任何帮助将不胜感激

经过大量研究,我找到了解决方案。所以现在在获取针对 id 的查询集时,我正在使用 "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 所以它会锁定行直到交易成功或失败。

如果大家有更好的建议欢迎分享。