2016-11-16 164 views
0

我使用的是Python 3.5,Django 1.8和PostgreSql 9.4。Django行锁定模型表格

因此,我有一个编辑方法,在获取请求时我正在呈现表单,当用户提交表单时,它将得到更新。她是代码

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

任何帮助将非常感激

回答

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,所以它会锁定行,直到事务成功或失败。

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