Django .save() 还原

Posted

技术标签:

【中文标题】Django .save() 还原【英文标题】:Django .save() Reverts 【发布时间】:2011-05-23 20:49:10 【问题描述】:

我在模型中设置了一个称为状态的 InteferField。我有一个方法是两个切换两行状态的值。

Row one -> status = 1
Row two -> status = 2

现在,我想,如果我将第一行的状态切换到某个无法达到的范围 (99),我可以使用它作为中间人来切换第二行,然后切换第一行。

Get status = 1 -> Row one
Get status = 2 -> Row two
Set Row one -> status = 99
Save Row one
Set Row two -> status = 1
Save Row two
Get status = 99 -> Row one
Set Row one -> status = 2
Save Row one

奇怪的是,数据恢复了。如果我只是将第 1 行的状态更改为 99,它将更改为 99,然后再过一会儿,恢复到原来的值。我们不确定为什么会发生这种情况,但事实证明这根本不是什么东西。

original = 1
swap = 2

originalCase = Case.objects.get(queue_num = original)
#swapCase = Case.objects.get(queue_num = swap)
originalCase.queue_num = 99
originalCase.save()
#swapCase.queue_num = original
#swapCase.save()
#originalCase = Case.objects.get(queue_num = 99)
#originalCase.queue_num = swap
#originalCase.save()
return HttpResponse(Case.objects.filter(queue_num__gt=0).order_by('queue_num'))

是不是因为我们查询速度太快而没有及时更新以进行下一次更新?还是我的逻辑有问题?

【问题讨论】:

【参考方案1】:

嗯...不应该如下:

originalCase = Case.objects.get(queue_num = swap)

是这样的:

originalCase = Case.objects.get(queue_num = 99)

如果您按原样复制并粘贴该代码,那就是您的问题。您实际上是在获取刚刚更改的那个并将其更改回来。

更新:

简化代码也可能有助于找出问题所在。从技术上讲,您不需要交换占位符。由于查询在最初获取所有对象时仅访问数据库一次,因此您可以执行以下操作:

cases = Case.objects.all()
for case in cases:
    if case.queue_num == original:
        case.queue_num = swap
    elif case.queue_num == swap:
        case.queue_num = original

    case.save()

或者,如果您想保持相同的想法,您甚至可以执行以下操作(实际上可能更简单):

Case.objects.filter(queue_num=original).update(queue_num=99)
Case.objects.filter(queue_num=swap).update(queue_num=original)
Case.objects.filter(queue_num=99).update(queue_num=swap)

【讨论】:

糟糕,抱歉,这就是我们的代码。但我也只运行了编辑后的代码,它仍然会恢复。 我认为您的代码需要更多上下文。根据您发布的内容,它不应再“还原”了。 这正是我们感到困惑的原因。我们只运行那个单一的功能。这就是那里的全部功能。我们做请求,就是这样。该选项卡保持打开状态。但是在 HttpResponse 之后,什么都不会发生。 我们解决了这个问题。它实际上归结为 urls.py 的问题。根还调用了另一个我们不想调用的函数。我们在这个函数上方有 (r'^$','index') ,因此调用了一个重置​​方法。感谢您的帮助和建议的更简单的代码。【参考方案2】:

从底部开始的第 2,3,4 行无效:

originalCase = Case.objects.get(queue_num = swap)
originalCase.queue_num = swap
originalCase.save()

【讨论】:

抱歉,打错了。它最初是 queue_num = 99,但是即使我运行编辑后的代码,它仍然会恢复。

以上是关于Django .save() 还原的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何覆盖 form.save()?

如何在 django 中获取 .save() 的查询?

Django:在模型 save() 方法中返回序列化程序 ValidationError

表单对象没有属性“save_m2m”django

在 Django 模型中使用 save() 会产生 TypeError

在 Django 的 save() 中执行 delete()