2010-09-07 38 views
0

我試圖做一個Django數據庫保存從一個窗體,我不得不手動指定字段名(正如我在第二個代碼塊中那樣),我嘗試這樣做的方式如下(第一個代碼塊),因爲我從另一個SO帖子。然而,當我嘗試這個時,我得到的錯誤「字典更新序列元素#0長度爲4; 2是必需的」,我甚至嘗試過,如下所示,只用一個testdict字典,而不是request.POST,但我仍然得到的錯誤..顯然該字段的值是罰款,因爲它在第二代碼塊中工作,所以我很難爲這種情況發生,將不勝感激,如果任何人都可以擺脫這個對我來說這個...謝謝Django/Python,使用iteritems()更新數據庫給出了奇怪的錯誤:「字典更新序列元素#0有長度4; 2是必需的」

嘗試這種方式給出了錯誤:

testdict = {'name':'account_username','value':'vvvvvv'} 
for name, value in testdict.iteritems(): 
    if name != '' and name != 'top_select': 
     b = Twitter(**dict((name, value))) 
     b.save() 
>>> dictionary update sequence element #0 has length 4; 2 is required 

但能正常工作:

b = Twitter(account_username='vvvvvv') 
b.save() 

回答

1

不知道你正在嘗試做的,但也許你想是這樣的

b = Twitter(**{name: value}) 

但要獲得相當於Twitter(account_username='vvvvvv')你需要像這樣

Twitter(**{testdict['name'], testdict['value']}) 

其中testdict將只包含一個單個實體發送到Twitter()

然後代碼會看起來更像這個

test_twits = [{'name':'account_username','value':'vvvvvv'}, 
       {'name':'account_username','value':'wwwwww'}, 
       ] 
for twit in test_twits: 
    name = twit['name'] 
    value = twit['value'] 
    if name != '' and name != 'top_select': 
     b = Twitter(**{name: value}) 
     b.save() 
+0

爲什麼不只是'B =推特(** {名稱長度:value})'? – 2010-09-07 04:16:34

+0

會嘗試這兩種方式,它爲django數據庫調用,所以不能確定它需要的正常方式,他們建議是第二代碼塊,但我不想這樣做,因爲我想迭代通過沒有手動輸入名稱 – Rick 2010-09-07 04:19:41

+0

@Jack,或許我認爲更好。我改了它 – 2010-09-07 04:30:31

0

糾正我,如果我錯了。

從你的第二個代碼片段中,我認爲Twitter類需要account_username作爲關鍵字參數。當您使用iteritems迭代字典時,您傳遞的是name - 即字典的關鍵字作爲類的關鍵字參數。這不是錯的嗎?字典的鍵是namevalue,_not _ account_username。我相信你需要其中一個來自字典的值作爲關鍵字參數傳遞,而不是其中一個鍵

+0

是啊,我猜這個語法不同於使用常規字典而不是來自django的request.POST,所以我做錯了 – Rick 2010-09-07 05:24:20

0

只是這樣做:

dict(((name, value),)) 

「字典」需要密鑰的序列,值元,而你給它一個鍵,值元組。

它說」 ......序列元素#0具有長度4' 的原因是因爲從testdict密鑰‘姓名’具有4

相關問題