2016-11-16 21 views
0

私はPython 3.5、Django 1.8およびPostgreSql 9.4を使用しています。モデルフォームのDjango行レベルロック

私は1つの編集方法を持っています。私はフォームをレンダリングしています。ユーザーがフォームを送信すると、そのフォームが更新されます。彼女は今、私は一人のユーザーが同時に何かを更新している場合は、前のトランザクションが成功したか、誰かが他のより良い提案があればしない限り、他のことができ、更新は何もできなくなりますようにそれに行レベルのロックを追加するコード

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

ですPessimistic Lockingを使用するのではなく、

私は約select_for_updateを知っているが、すべてのヘルプは本当に私は解決策を考え出したので、多くの研究の後

答えて

1

をいただければ幸いそれはform.save()

の場合には実装されますどのように任意のアイデアを持っていません。だから今のIDに対してクエリセットを取得しながら、私はあなたが私がトランザクションの下で、クエリセットオブジェクトを取得していますし、任意の例外がトランザクション中に現れた場合、それは自動的に意志今見ることができるように、この

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」を使用していますまた、select_for_updateを使用しているので、トランザクションが成功するか失敗するまで行をロックします。

誰かより良い提案があれば、それを親切に共有してください。