2011-05-23 42 views
0

我在稱爲狀態的模型中設置了InteferField。我有一個方法是兩個切換兩行狀態的值。Django .save()還原

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')) 

是因爲我們查詢速度很快而且沒有及時更新下一次更新?或者我的邏輯存在缺陷?

回答

0

嗯......不應該如下:

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

是這樣的:

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

如果您複製並粘貼代碼原樣,那是你的問題。你本質上是取得你剛剛改變的那個,並將它改回來。

UPDATE:

簡化您的代碼可以幫助揪出問題,也是如此。您在技術上不需要交換佔位符。因爲查詢訪問數據庫只有一次在最初獲取的所有對象,你可以這樣做以下:

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) 
+0

Woops,對不起,這是我們的代碼。但我也運行了編輯過的代碼,它仍然恢復。 – tlunter 2011-05-23 20:58:10

+0

我認爲你的代碼需要更多的上下文。根據你發佈的內容,它不應該再「回覆」。 – 2011-05-23 21:16:25

+0

正是我們爲什麼感到困惑。我們只運行那個單一功能。那是完整的功能。我們做這個請求,就是這樣。該選項卡保持打開狀態。但是在HttpResponse之後,什麼都不應該發生。 – tlunter 2011-05-23 21:23:28

0

線2,3,4沒有任何效果:

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

對不起,這是一個錯誤的。它最初是queue_num = 99,但即使我運行編輯的代碼,它仍然會恢復。 – tlunter 2011-05-23 20:59:17