2016-12-04 10 views
0

私は、このモデルを持っている:スイッチ - ジャンゴ

class Person(models.Model) 
    id = IntegerField() 
    place_in_line = IntegerField() 

私が欲しい避けるレース条件に、このコードで、私はは同じ2つのPersonオブジェクトを持っているを買う余裕はありません以下のように配置します。

@transaction.atomic 
def switch(person1, person2) 
    place1 = person1.place_in_line 
    place2 = person2.place_in_line 
    person1.place_in_line = place2 
    person2.place_in_line = place1 
    person1.save() 
    person2.save() 

私はFまたはケース式を使用して試してみましたが、それらはすべて自分自身にではなく、他の任意のフィールドを参照してください...

ありがとうございます。誰でも好奇心旺盛であれば

+0

[unique](https://docs.djangoproject.com/en/1.10/ref/models/fields/#unique)パラメータをフィールドに追加しますか? – Ben

+0

これは私の現在の解決策です。それはアクションを実行しないので十分ではありません...(私はユニークでtransaction.atomicで再試行を使用します) –

答えて

0

を試すことができ、私は@retryでこの事を包むことになった、かなり良い動作しているように思われます。

0

あなたは、

with transaction.atomic(): 
    Person.objects.filter(id__in=person1).update(place_in_line=place2) 
    Person.objects.filter(id__in=person2).update(place_in_line=place1) 
+0

私が正しく理解しても、これは他のインスタンスが優先順位を1つに切り替えることを保証するものではなく、同じ番号...病気を解明してそのことを明らかにする –