2012-12-11 56 views
0

我正在發出一個返回序列化數據的請求。我遍歷數據並檢查它是否存在於數據庫中。如果存在則被忽略,如果不存在則保存。我遇到的問題是for循環僅保存第一條記錄,即使它遍歷數據的所有鍵並將其與數據庫中的內容進行比較。我的代碼如下:保存for循環的每次迭代

b = MyModel() 
data #The serialized data 
existingData = Off.object.filter(...) 

for key in data: 
    if existingData.filter(id_str=key['id_str']).exists(): 
     pass #If I place a print key['id_str'] here, all skipped items are printed. 
    else: 
     b.x = key['x'] 
     b.y = key['y'] 
     b.save() 

函數運行一個計數器每次被放置在else語句的底部b.save()後的計數器增加,但只有通過檢查的第一個記錄是保存和的休息數據中的項目不會被保存。我哪裏錯了?

+0

你怎麼知道問題不在'MyModel.save'中? – mgilson

+0

有什麼方法可以檢查嗎?當我第一次寫這個只是爲了測試它,我得到的數據回3次,並保存所有的鍵3次。現在我只保存1 :-( –

+2

接受一些其他的答案,然後我們會幫你的。 –

回答

2

首先你可能會覆蓋相同b對象,而不是創建一個新的;我的意思是你檢查一些id_str對象不存在,但你只是覆蓋bxy屬性。也許你需要做的是:

for item in data: 
    if not existingData.filter(id_str=item.get('id_str')).exists(): 
     MyModel.objects.create(id_str=item.get('id_str'), 
           x=item.get('x'), 
           y=item.get('y')) 

希望這有助於:)

乾杯!

+0

這次我沒有忘記接受。:-D謝謝你的幫助 –

+1

請注意,在循環中執行數據庫操作通常是一個糟糕的主意,除非您可以絕對確定迭代次數會很慢,否則操作將有機會脫離您,並且真正放慢速度。想想未來的事情 –

+0

絕對是真的!+1 :) – Gerard