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:更新 X 数量模型的表单

Django,调用 super() 后如何在 save() 方法中更新模型?

如何以 django 模型形式覆盖保存方法

如何在保存模型后向django管理员显示消息?

保存/更新模型时,Django“超过锁定等待超时;尝试重新启动事务”

保存时跳过字段(Django 模型、插入和更新)