Django/Python,使用iteritems()更新数据库时出现奇怪错误:“字典更新序列元素#0长度为4;需要2”
我正在尝试通过一个表单在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
(也就是字典的键)作为关键字参数传给了这个类。这样做是不是不对呢?字典的键是 name
和 value
,而不是 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()