Django - 特定时间后的transaction.atomic回滚

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django - 特定时间后的transaction.atomic回滚相关的知识,希望对你有一定的参考价值。

我正在尝试使用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

答案

你需要的是一个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你阻止这个房间五分钟。

由于您正在做两件需要一起完成的事情,因此您需要将它们包装在事务中。

以上是关于Django - 特定时间后的transaction.atomic回滚的主要内容,如果未能解决你的问题,请参考以下文章

安装后的 django 文件夹在哪里?

django模板:过滤后的点

Django - 遵循向后的 ForeignKey,然后是 ForeignKey(查询)

有啥方法可以将过滤后的查询集传递给 Django 分页?

成功登录后的 Django 重定向

更新到 1.4 后的 Django syncdb 异常