问题描述
|
我在称为状态的模型中设置了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\'))
是因为我们要查询的很快,并且没有及时更新下一次更新吗?还是我的逻辑存在缺陷?
解决方法
嗯...不应该这样:
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)
,从底部开始的第2、3、4行无效:
originalCase = Case.objects.get(queue_num = swap)
originalCase.queue_num = swap
originalCase.save()