【问题标题】:Django Row Level Locking For Model Forms模型表单的 Django 行级别锁定
【发布时间】:2016-11-25 17:43:47
【问题描述】:

我正在使用 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() 的情况下它将如何实现

任何帮助将不胜感激

【问题讨论】:

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


    【解决方案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 所以它会锁定行直到事务成功或失败.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2017-10-06
      相关资源
      最近更新 更多