2014-02-27 49 views
0

假設我有一些Django的模型,我更新實例更新中,只有當它需要更新

def modify_thing(id, new_blah): 
    mything = MyModel.objects.get(pk=id) 
    mything.blah = new_blah 
    mything.save() 

我的問題是,如果它發生了,這已經是情況mything.blah == new_blah一個Django模型場,django是否知道這一點,並不打擾再次保存這個[非]修改?或者它會一直進入數據庫(在我的情況下是MySQL)並更新數據?

如果我想避免不必要的寫操作,這有任何意義,做這樣的事情:

if mything.blah != new_blah: 
    mything.blah = new_blah 
    mything.save() 

鑑於該記錄將不得不從數據庫中讀取反正爲了做的比較第一名?這種構造是否有效?如果是這樣的話,是否有比Python中的if語句更難看的方法?

+0

你可以看看正在執行的SQL語句,並從那裏進行優化? – nathancahill

+0

您可以覆蓋模型類中的保存方法,以檢查每次保存方法標識爲 –

回答

0

你可以使用Django Signals來確保你剛剛發佈的代碼不要寫入db到。看看pre_save,這就是你要找的信號。

+0

您能解釋一下如何保存任何數據庫命中? – Anup

+0

「打」我的意思是「寫」,對不起,我不清楚。 –

0

鑑於django不會緩存這些值,所以到DB的旅程是不可避免的,您必須獲取它以比較該值。當然,我們沒有那麼難看的方法來做到這一點。你可以這樣做

if mything.blah is new_blah: 
    #Do nothing 
else: 
    mything.blah = new_blah 
    mything.blah.save() 
+0

這段代碼沒問題,但我認爲它更適合'pre_save'信號處理程序。你不覺得嗎? –

+0

理想情況下,當您想要在處理某些事項之前或之後處理某些情況時,可能會使用一個信號,例如:在保存某些內容之前,我可能需要檢查某些條件是否已滿足並存在。這裏對於給定的用例來說,它增加了更多的複雜性而不是解決問題。 – Anup