Django:保存模型后如何不再允许模型更新?

时间:2014-10-24 01:26:31

标签: django save override race-condition

我有以下预订模式。

class Reservation(models.Model):
    user = models.ForeignKey('index:User', null=True)
    shop = models.ForeignKey('index:Shop')
    datetime = models.DateTimeField(null=True, error_messages={})

使用网站的客户可以预订,如果他们点击预订按钮 表单提交发生。视图如下所述。

...
if form.is_valid:
    user = request.user

    # check if reservation happend before by other customer
    if reservation.user == None:
        # if reservation user attribute is empty. allocate user attribute.
        reservation.user = user
        reservation.save()

但是让我们猜两个人,A和B都试图保留相同的预订对象。首先单击并检查reservation.user是None并尝试将用户属性分配给预留对象,而B检查reservation.user是None。

在这种情况下,B可以覆盖reservation.user属性。但我不希望这种覆盖发生..并让B知道预订已经完成。我该怎么做?

提前致谢

1 个答案:

答案 0 :(得分:1)

在环顾四周之后,我找到的最佳选择似乎是django-concurrency

它实现了optimistic locks,正如我所理解的(这个xD的新手)不会锁定对象并强制其他线程等待。相反,它继续并完成操作,但在保存到数据库之前检查对象是否已被读取,然后保存它。

他们给出的例子与你想要的非常相似:

a = ConcurrentModel.objects.get(pk=1)
b = ConcurrentModel.objects.get(pk=1)
a.save()
b.save()

检查提交似乎已为django 1.7做好准备,但documentation尚未完全更新。

要使这个工作看起来很简单......只需将concurrency.fields.VersionField中的一个添加到需要此功能的模型中。

我没有亲自测试过这个,因为到目前为止我还没有这个需要(但是我可以看到一些情况,我可以......谢谢)。测试它,如果某些东西不起作用,请发表评论。