Django / Python,使用iteritems()更新数据库会产生奇怪的错误:“字典更新序列元素#0的长度为4;需要2个”

时间:2010-09-07 04:08:14

标签: python django dictionary loops

我正在尝试从一个表单中执行Django数据库保存,我不必手动指定字段名(就像我在第二个代码块中那样),我尝试这样做的方式如下(第一个代码块)因为我得到了另一个SO的提示帖子。但是,当我尝试这个时,我得到错误“字典更新序列元素#0有长度4; 2是必需的”,我甚至尝试了它,如下所示,只有一个testdict字典,而不是request.POST,但我仍然得到错误..显然字段值很好,因为它在第二个代码块中工作,所以我很难过为什么会发生这种情况,如果有人能为我阐明这一点,我将不胜感激...谢谢

以这种方式尝试会产生错误:

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

如果我错了,请纠正我。

从第二个代码段开始,我认为Twitter类需要account_username作为关键字参数。当您使用iteritems遍历字典时,您将name - 即字典的键作为关键字参数传递给类。这不对吗?字典的键是namevalue,_不是_ account_username。我相信您需要将字典中的作为关键字参数传递,而不是其中一个键

答案 2 :(得分:0)

这样做:

dict(((name, value),))

'dict'采用一系列键值元组,而你给它一个键,值元组。

它说“...序列元素#0长度为4”的原因是因为来自testdict的键'name'的长度为4。