2012-12-07 85 views
7

我有一個Django模型,TestModel,通過SQL數據庫。Django模型檢索相同的結果

每當我做

TestModel.objects.all() 

我看來,如果我來自同一個過程多次運行它會得到相同的結果。我通過手動刪除(不使用任何django基元)從模型構建的表中的一行來測試,查詢仍然返回相同的結果,即使顯然在刪除後應該有更少的對象。

是否有某種緩存機制,並且每次我想要檢索對象時,django都不會去數據庫?

如果存在,是否還有辦法強制django轉到每個查詢的數據庫,最好是不寫原始SQL查詢?

我還應該指定通過重新啓動該過程模型再次返回正確的對象,我不再看到已刪除的對象,但是如果我再刪除一些問題,則會再次出現該問題。

+0

我根本不知道Django,但是最後一次我遇到了類似的問題,我意識到我沒有使用我認爲是的數據庫。你最近還沒有改變過這條路,不是嗎? – PeterBB

+0

@PeterBB我更新了描述,我確信我正在使用正確的數據庫,因爲每次重新啓動使用模型的進程都會更新這些更改。 –

+0

這是發生在Web請求之間還是在shell級別? – danihp

回答

1

這是因爲您的數據庫隔離級別是可重複讀取的。在django shell中,所有的請求都被包含在一個事務中。

編輯

你可以在你的shell嘗試:

from django.db import transaction 
with transaction.autocommit(): 
    t = TestModel.objects.all() 
    ... 
-1

聽起來像一個數據庫事務的問題。如果在單獨進入數據庫本身並修改數據時保持打開一個shell會話,那麼在shell中打開的事務將不會看到由於隔離而導致的更改。您需要退出並重新加載shell以獲取新事務,然後才能看到它們。

請注意,在生產中,交易與請求/響應週期相關聯,所以這不會是一個重大問題。

+0

這是生產過程中需要考慮的一個非常重要的問題。因爲高隔離級別會導致更多的鎖定,而低隔離級別可能會影響計算。 – danihp

+0

我並不是說交易本身並不重要,只是通常你不會看到這種不一致,因爲請求是短暫的。 –