2016-07-10 6 views
1
# /uri/one/{pk}/ 
class ModelOneView(generic.View): 
    def post(self, request, pk): # pk has the same value as below 
     Model.objects.filter(pk=pk).update(name=request.POST['name']) 
     return HttpResponse(status=200) 

# /uri/two/{pk}/ 
class ModelTwoView(generic.View): 
    def post(self, request, pk): # pk has the same value as above 
     Model.objects.filter(pk=pk).update(bool_field=True) 
     return HttpResponse(status=200) 

私はコードを単純化しましたが、基本的には、同じフィールド(同じフィールドではありません)で両方とも両方の変更を行う2つの異なるURIを持っています。 ここでの問題は、クライアントが基本的に同じ時間に両方を呼び出すことです。Djangoモデルのフィールドを同時に編集する

// script.js in my index.html 
function notHealthyForDjango() { 
    callFirstURI(); 
    callSecondURI(); 
} 

ジャンゴもクライアントのいずれも任意の時点で、すべてのエラーを投げ、私はOK応答を受信します。しかし、私がcallFirstURI()を使って行った変更。決してデータベースに到達しない。しかし、私はcallSecondURI()をコメントアウトします。

function notHealthyForDjango() { 
    callFirstURI(); 
    //callSecondURI(); 
} 

ここで、最初のURIへの呼び出しは、意図したとおりに動作します。

どうすればこの問題を解決できますか? psql、Python 2.7、Django 1.9を使用しています。 どうすればモデルのフィールドを変更できますか?そのような衝突の危険はありませんか?私だけではなく、より好ましく私のクライアントのjavascriptの要求のタイミングの問題のためにサーバー側の解決策を見つけるしたいと思います

EDIT

。あなたは試してみたいことがあります

+0

私の提案を試しましたか? – e4c5

+0

すみませんが、私はまだ時間がありませんでした。私は今週末にこれに戻り、これが問題を解決するかどうかを見ていきます。非常に有望で、私はあなたの助けに本当に感謝しています!遅れて申し訳ありません。 – user3622167

+0

それが働いたことを知ってうれしい。今日あなたの質問をupvoteすることはできません(投票のうち、明日行います) – e4c5

答えて

1

select_for_updateを考えましたか?

サポートされているデータベースに対するUPDATE SQL文SELECT ... FORを生成し、 トランザクションが終了するまでの行をロックしますクエリセットを返します。

サポートされるデータベースは、Postgresql、Oracle、およびMysqlです。私はあなたがあなたのデータベースについて言及していないことに気付きます。 sqliteはサポートされていませんが、少なくともLinuxでは問題はほとんどありません。なぜなら、ファイルロックは同じデータがsqliteで書かれていることを確実にするからです。

最高の結果を得るには、これをアトミックトランザクションで使用する必要があります。

def post(self, request, pk): # pk has the same value as below 
    with transaction.atomic(): 
     Model.objects.select_for_update().filter(pk=pk).update(
         name=request.POST['name']) 
     return HttpResponse(status=200) 
0

つの提案:

  1. が実行callSecondURI()callFirstURI()完了後のコールバックを使用して、AJAXリクエスト

  2. でそれは上決して私は(専門家を適用しない場合がありますこれは)マルチスレッドと関係があるように思えます。これを扱うデコレータはthis questionをご覧ください。

+0

ちょっとヤコブ!ご回答いただきありがとうございます。あなたの最初の勧告で書いているようにそれをすることはうまくいきます。しかし、可能であれば、この問題のサーバー側の解決策を探したいと思います。私はそれについて明確でないために悪いです。私はあなたの2番目のお勧めを少し後でチェックアウトします! – user3622167

+0

こんにちは、私は助けてうれしい。ソリューションが機能していれば、答えを受け入れることを検討してください。私はサーバーサイドアプローチを提供していないと理解していますが –

関連する問題