Едно просто решение би било да поставите брояча и победителя в модела на играта. След това можете да използвате select_for_update
за да заключите записа:
game = Game.objects.select_for_update().get(pk=gamepk)
if game.number + 1 == X
# he is a winner
game.winner = request.user
game.number = game.number + 1
game.save()
else:
# u might need to stop the game if a winner already decided
Като част от същата транзакция можете също да запишете Player
s обекти, така че да знаете също кой е кликнал и да проследите друга информация, но не поставяйте номера и победителя там. За да използвате select_for_update
трябва да използвате postgresql_psycopg2
бекенд.
Актуализация: Тъй като django е включил autocommit по подразбиране, трябва да обвиете горния код в атомна транзакция. От django docs
Можете да украсите своя изглед с @transaction.atomic
:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()