Django:保存模型后如何不再更新模型?
Posted
技术标签:
【中文标题】Django:保存模型后如何不再更新模型?【英文标题】:Django : after saving model how not allow model to be updated anymore? 【发布时间】:2014-10-24 01:26:30 【问题描述】:我有如下预订模式。
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,并尝试将用户属性分配给reservation 对象,而B 检查reservation.user 是否为None。
在这种情况下,B 可以覆盖 reservation.user 属性。但我不希望这种覆盖发生.. 也让 B 知道预订已经完成。我怎样才能做到?
提前致谢
【问题讨论】:
【参考方案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 之一添加到需要此功能的模型中。
我没有亲自测试过这个,因为到目前为止我还不需要这个(但我可以看到一些我可能......谢谢的情况)。对其进行测试,如果有问题,请发表评论。
【讨论】:
以上是关于Django:保存模型后如何不再更新模型?的主要内容,如果未能解决你的问题,请参考以下文章
Django,调用 super() 后如何在 save() 方法中更新模型?