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

0 投票
3 回答
1457 浏览
提问于 2025-04-16 03:47

我正在尝试通过一个表单在Django中保存数据,但我不想像第二个代码块那样手动指定字段名。我想用下面的方式来实现(第一个代码块),这是我从另一个StackOverflow帖子上得到的建议。然而,当我这样做时,出现了一个错误:“字典更新序列元素#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

只需要这样做:

dict(((name, value),))

‘dict’这个东西需要一串键值对的组合,而你给它的是一个单独的键值对。

它之所以说‘...序列元素#0的长度是4’,是因为在testdict里,键‘name’的长度是4。

0

如果我说错了,请纠正我。

从你第二段代码来看,Twitter 类需要一个叫 account_username 的关键字参数。当你用 iteritems 遍历字典时,你把 name(也就是字典的键)作为关键字参数传给了这个类。这样做是不是不对呢?字典的键是 namevalue,而不是 account_username。我觉得你应该把字典中的某个值作为关键字参数传进去,而不是某个键。

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

撰写回答