错误:Django 1.4 上的“字典更新序列元素 #0 的长度为 1;需要 2”
Posted
技术标签:
【中文标题】错误:Django 1.4 上的“字典更新序列元素 #0 的长度为 1;需要 2”【英文标题】:Error: "dictionary update sequence element #0 has length 1; 2 is required" on Django 1.4 【发布时间】:2013-07-10 17:59:01 【问题描述】:我在 Django 1.4 上有一条错误消息:
dictionary update sequence element #0 has length 1; 2 is required
当我尝试使用模板标签时发生这种情况:% for v in values %
:
dictionary update sequence element #0 has length 1; 2 is required
Request Method: GET
Request URL: ...
Django Version: 1.4.5
Exception Type: ValueError
Exception Value:
dictionary update sequence element #0 has length 1; 2 is required
Exception Location: /usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __init__, line 21
Python Executable: /usr/bin/uwsgi-core
Python Version: 2.7.3
Python Path:
['/var/www/',
'.',
'',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PIL',
'/usr/lib/pymodules/python2.7']
Server time: sam, 13 Jul 2013 16:15:45 +0200
Error during template rendering
In template /var/www/templates/app/index.html, error at line 172
dictionary update sequence element #0 has length 1; 2 is required
172 % for product in products %
Traceback Switch to copy-and-paste view
/usr/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response
response = callback(request, *callback_args, **callback_kwargs)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/contrib/auth/decorators.py in _wrapped_view
return view_func(request, *args, **kwargs)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/views/decorators/http.py in inner
return func(request, *args, **kwargs)
...
▶ Local vars
./app/views.py in index
context_instance=RequestContext(request))
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/shortcuts/__init__.py in render_to_response
return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/loader.py in render_to_string
return t.render(context_instance)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render
return self._render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in _render
return self.nodelist.render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render
bit = self.render_node(node, context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node
return node.render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/loader_tags.py in render
return compiled_parent._render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in _render
return self.nodelist.render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render
bit = self.render_node(node, context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node
return node.render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/loader_tags.py in render
result = block.nodelist.render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render
bit = self.render_node(node, context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node
return node.render(context)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/template/defaulttags.py in render
len_values = len(values)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/core/paginator.py in __len__
return len(self.object_list)
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/db/models/query.py in __len__
self._result_cache = list(self.iterator())
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/db/models/query.py in iterator
obj = model(*row[index_start:aggregate_start])
...
▶ Local vars
/usr/lib/python2.7/dist-packages/django/db/models/base.py in __init__
setattr(self, field.attname, val)
...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __set__
value = self.field._attribute_class(value, self.field, obj)
...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __init__
super(HStoreDictionary, self).__init__(value, **params)
...
▶ Local vars
当我尝试访问 hstore 查询集时也会发生这种情况:
Traceback (most recent call last):
File "manage.py", line 14, in <module>
execute_manager(settings)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 459, in execute_manager
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/home/name/workspace/project/app/data/commands/my_command.py", line 60, in handle
item_id = tmp[0].id,
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 207, in __getitem__
return list(qs)[0]
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 87, in __len__
self._result_cache.extend(self._iter)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 301, in iterator
obj = model(*row[index_start:aggregate_start])
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 300, in __init__
setattr(self, field.attname, val)
File "/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py", line 38, in __set__
value = self.field._attribute_class(value, self.field, obj)
File "/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py", line 21, in __init__
super(HStoreDictionary, self).__init__(value, **params)
ValueError: dictionary update sequence element #0 has length 1; 2 is required
代码是:
tmp = Item.objects.where(HE("kv").contains('key':value))
if tmp.count() > 0:
item_id = tmp[0].id,
我只是想访问该值。我不明白“更新序列”消息。当我使用游标而不是hstore queryset
时,该功能起作用。该错误也出现在模板渲染上。我刚刚重启了uwsgi
,一切正常,但稍后又出现错误。
【问题讨论】:
请发布显示values
和tmp
中内容的代码。虽然缺少代码,但此问题为 -1(可能是临时的)。
我会将其添加为评论。我收到错误是因为我使用了列表而不是元组。这会引发错误:dict(['A',"b"])
而这不会dict([('A',"b")])
【参考方案1】:
当您尝试以下操作时,您的问题会出现错误:
>>> a_dictionary =
>>> a_dictionary.update([[1]])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required
除非你展示你的代码,完整的回溯,否则很难判断代码中的原因。
【讨论】:
这确认了问题中不包含原因。 感谢回答 下次我会复制traceback,但是很奇怪,当它发生在模板标签上时,刚重新启动uwsgi后,结果显示正常,所以有结果 @user2575627,你为什么不现在发布代码/回溯?更新(编辑)您的问题。 抱歉,因为急需修复/修复服务,所以没有贴code/traceback,所以没有第一时间复制traceback @user2575627,您能否在 /home/name/workspace/project/app/data/commands/my_command.py 第 60 行附近发布代码?【参考方案2】:刚刚遇到这个问题。我不知道它是否与您的代码相同,但对我来说,根本原因是因为我忘记将name=
放在url
(或Django 2.0+ 中的path
)函数的最后一个参数上打电话。
例如,以下函数会从问题中抛出错误:
url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), 'foo')
path('foo/slug:bar/', views.FooBar, 'foo')
但这些确实有效:
url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), name='foo')
path('foo/slug:bar/', views.FooBar, name='foo')
回溯没有帮助的原因是因为在内部,Django 想要将给定的 positional 参数解析为 keyword 参数kwargs
,并且由于字符串是可迭代,一个非典型的代码路径开始展开。始终在您的网址上使用name=
!
【讨论】:
这个答案非常好,因为它涵盖了一个难以弄清楚的晦涩错误。即使是经验丰富的 Django 开发人员也可能落入这个特定的陷阱。 特别是如果您还使用 Django RestFramework 的Router.register
方法。看起来很相似,不同的是name
kwarg...
嗯,这半个小时徒劳无功,永远不会回来。 tnx.
太棒了!谢谢!我进行了很多测试,但没有看到这个 kwarg 的东西.. phuuuu
仅供参考,我也使用 Django 2.0 样式 path
URL 收到此错误。忘记使用 kwarg 并有这个:path('foo/', views.foo, 'foo')
。我不得不改成path('foo/', views.foo, name='foo')
【参考方案3】:
这是重现的错误。
>>> d =
>>> d.update([(1,)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required
>>>
>>> d
>>>
>>> d.update([(1, 2)])
>>> d
1: 2
>>>
>>> d.update('hello_some_string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required
>>>
如果您给出序列并且任何元素长度为 1 并且需要 2,那么我们将得到这种错误。 见上面的代码。我第一次给出带有元组的序列并且它的长度为 1,然后我们得到了错误并且字典没有更新。我第二次在包含两个元素的元组中给出,字典得到了更新。
【讨论】:
我在使用 shortucts.redirect 并尝试将响应发送到外部页面时遇到了同样的错误。例如' [code] return redirect("msn.com")[/code]【参考方案4】:您错误地发送了一个参数;应该是dictionary object
:
错误: func(a=r)
正确: func(a='x':y)
【讨论】:
【参考方案5】:我遇到了同样的问题,发现是由于参数错误。
在views.py
,我使用了:
return render(request, 'demo.html','items', items)
但我发现了问题:'items', items
。更改为 'items': items
解决了该问题。
【讨论】:
【参考方案6】:我在尝试使用错误类型的参数调用更新方法时遇到了这个问题。 预期的字典是:
'foo': True
通过的是:
'foo': "True"
确保检查您传递的所有参数都是预期的类型。
【讨论】:
【参考方案7】:在我的例子中,我的 get_context_data
在我的一个观点中是在 try/catch 块中返回 return render(self.request, 'es_connection_error.html', 'error':error);
而不是返回 context
【讨论】:
【参考方案8】:当我忘记将关键字参数 name 传递给 url() 函数时,我遇到了上述问题。
有错误的代码
url(r"^testing/$", views.testing, "testing")
没有错误的代码
url(r"^testing/$", views.testing, name="testing")
所以最后我以这种方式消除了上述错误。在你的情况下可能会有所不同。因此,请检查 urls.py 中的 url 模式。
【讨论】:
2019 和相同的 *** 答案仍然每次都能救我 是的,非常感谢。 SO 对于开发人员、科学家和其他人来说确实是一个很棒的平台。【参考方案9】:解决方案»
将关键字参数 name 与值作为您的视图名称,例如 home
或 home-view
等传递给 url()
函数。
引发错误»
url(r'^home$', 'common.views.view1', 'home'),
正确»
url(r'^home$', 'common.views.view1', name='home'),
【讨论】:
【参考方案10】:错误应该与参数有关。 请验证参数是否为字典对象。如果它只是一个参数列表/元组,则只使用一个 * (*params
) 而不是两个 * (**params
)。这会将列表/元组分解为适当数量的参数。
或者,如果参数来自代码的其他部分作为 JSON 文件,请执行 json.loads(params)
,因为 JSON 对象有时表现为字符串,因此您需要使用从字符串加载 (加载)。
super(HStoreDictionary, self).__init__(value, **params)
希望这会有所帮助!
【讨论】:
【参考方案11】:我在搞乱字符串和字典时遇到了这个错误。
dict1 = 'taras': 'vaskiv', 'iruna': 'vaskiv'
str1 = str(dict1)
dict(str1)
*** ValueError: dictionary update sequence element #0 has length 1; 2 is required
所以你实际上需要做的是从字符串中获取字典:
dic2 = eval(str1)
dic2
'taras': 'vaskiv', 'iruna': 'vaskiv'
或者为了安全我们可以使用literal_eval
from ast import literal_eval
【讨论】:
还有其他方法吗? 是的,使用json.loads(dict1)
。使用eval
可能会带来安全风险【参考方案12】:
我也有类似的问题。解决方法很简单。只是不要尝试在值中输入 NULL 或 None 值,否则你可能不得不使用类似这样的东西dic.update([(key,value)])
【讨论】:
【参考方案13】:这是我在 Django 中遇到此错误并修复它的方式:
错误代码
urlpatterns = [path('home/', views.home, 'home'),]
更正
urlpatterns = [path('home/', views.home, name='home'),]
【讨论】:
这也发生在我身上,谢谢!我们知道这里发生了什么吗? @ValidusOculus 我不太确定,看来您必须使用 kwargs。你可以在这里阅读更多关于它的信息docs.djangoproject.com/en/4.0/ref/urls【参考方案14】:我在调用时遇到了这个错误:
dict(my_data)
我解决了这个问题:
import json
json.loads(my_data)
【讨论】:
【参考方案15】:在下面的示例中使用get_or_create
方法时也会发生这种行为,显然会出现该错误:
state,_ = Status.objects.get_or_create('Pending')
要解决此问题,您将添加相应的键和值。
即像这样state,_ = Status.objects.get_or_create(name='Pending')
【讨论】:
救命!需要这个。【参考方案16】:导致此错误的另一种情况:
dict('"a":1') # gives the error
实现您想要的一种方法是使用eval
eval('"a":1') # gives "a":1
【讨论】:
【参考方案17】:在你的字典中检查你的键或值中是否有单引号或双引号!
dict1 = 'hello': 'world', 'programmer's': 'have girlfriend'
要解决它,您只需将字典转换为字符串,然后使用替换方法!
【讨论】:
【参考方案18】:我在尝试将 json 字符串转换为 dict 时遇到了这个问题。
输入:'\r\n "resource_id": "id",\r\n "resource_type": "resource"\r\n'
使用dict()
将字符串转换为dict
给了我这个错误。正确的方法是使用json
模块。
示例:json.loads(input_str)
【讨论】:
以上是关于错误:Django 1.4 上的“字典更新序列元素 #0 的长度为 1;需要 2”的主要内容,如果未能解决你的问题,请参考以下文章
Spark DataFrame to Dict - 字典更新序列元素错误
Elastic Beanstalk:字典更新序列元素 #0 的长度为 1; 2 是必需的