我正在尝试使用django创建预订应用。
在我的应用程序中,用户可以选择一个座位并在5分钟内付款。
当用户选择座位时,状态将更改为已阻止。
如果未在5分钟内完成付款,则所选座位状态应更改为可用。
我不知道如何使用transaction.atomic()
来实现它。
通常可以实现异常rollback
,但在这里我该如何实现。
with transaction.atomic():
seat = Room.objects.get(account_id=location.id, seat_no=seat_no)
seat.state = blocked
seat.save()
如果在接下来的5分钟内未付款,如何将状态恢复为available
?
答案 0 :(得分:0)
您需要的是blocked_until
字段,即:
class Room(models.Moddel):
...
blocked_until = models.DateTimeField(default=datetime.datetime(1970,1,1))
默认值是"时间之前"值,即小于任何敏感值。
然后你的预备视图会:
def reserve(request, roomnumber, seatno):
now = datetime.datetime.now()
now5 = now + datetime.timedelta(minutes=5)
with transaction.atomic():
room = Room.objects.get_object_or_404(
pk=roomnumber, seat=seatno,
blocked_until__lt=now # <== 1
)
room.blocked_until = now5 # <== 2
room.save()
在1
,您将选择房间/座位,但前提是它没有被阻止,即block_until字段值是过去的。
在2
你阻止这个房间五分钟。
由于您正在做两件需要合作的事情,因此您需要将它们包装在一个交易中。