Django Row Level Lock for Model Forms

时间:2016-11-16 07:17:25

标签: python django postgresql django-forms row-level-security

我使用的是Python 3.5,Django 1.8和PostgreSql 9.4。

所以我有一个编辑方法,在get请求中我正在渲染表单,当用户提交表单时,它会更新。她是代码

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,
    )

现在我想在其上添加行级锁定,就好像一个用户同时更新某些内容,除非先前的事务成功或者有人有任何其他更好的建议而不是使用悲观锁定,否则其他用户将无法更新任何内容。 / p>

我知道select_for_update,但在form.save()

的情况下,我不知道如何实施

任何帮助都会非常感激

1 个答案:

答案 0 :(得分:1)

经过这么多研究,我找到了解决方案。所以现在在获取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时,它将锁定行,直到事务成功或失败。

如果有人有更好的建议,请亲切分享。