我有以下预订模式。
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知道预订已经完成。我该怎么做?
提前致谢
答案 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中的一个添加到需要此功能的模型中。
我没有亲自测试过这个,因为到目前为止我还没有这个需要(但是我可以看到一些情况,我可以......谢谢)。测试它,如果某些东西不起作用,请发表评论。