Django .save()还原

时间:2011-05-23 20:49:11

标签: python mysql django save

我在名为状态的模型中设置了一个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

奇怪的是,数据还原。如果我只是将第一行的状态更改为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'))

是不是因为我们要快速查询并且没有及时更新以进行下一次更新?或者我的逻辑是否存在缺陷?

2 个答案:

答案 0 :(得分:0)

嗯......不应该有以下几点:

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)

答案 1 :(得分:0)

从底部开始的2,3,4行没有效果:

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