2017-04-27 2 views
-1

私はdjango(1.5 with mysql)のselect_for_updateメソッドを使用して1つのモデルからデータを取得し、リクエストに応じてこのデータをユーザに提供しますが、2人のユーザが同時にリクエストすると、両方のユーザに対して同じデータが返されます。 django querysetのメソッドと並行処理を処理するには?

models.py 
class SaveAccessCode(models.Model): 
    code = models.CharField(max_length=10) 

class AccessCode(models.Model): 
    code = models.CharField(max_length=10) 
    state = models.CharField(max_length=10, default='OPEN') 


views.py 
def view(request, code): 
    # for example code = 234567 
    acccess_code = AccessCode.objects.select_for_update().filter(
    code=code, state='OPEN') 

    acccess_code.delete() 
    SaveAccessCode.objects.create(code=code) 
    return 

以下の同時要求が同じコードでSaveAccessCodeの二つのレコードが生成されます、このシナリオを処理する方法を私を導いてくださいより良い方法

+0

なぜ両方のユーザーに同じデータを配信しないのですか?なぜあなたはそれを望んでいないのですか?代わりに何をすべきですか?そして、あなたはどうやってこの方法を呼んでいますか? –

答えて

0

にあなたはselect_for_updateを行う際のモデルにいくつかのフラグを設定する必要がある、のようなもの:

qs.first().update(is_locked=True)` 

とその前に

qs = self.select_for_update().filter(state='OPEN', is_locked=False).order_by('id') 

のように選択する必要があります次に、ユーザーの後、私は推測、フラグis_locked=Falseを設定して保存し、それで何かを行って、保存されています。

fetch_available_code@staticmethodとしてください。