2016-11-16 67 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,所以它會鎖定行,直到事務成功或失敗。

如果有人有更好的建議,請分享一下。