I have an error message on Django 1.4:
dictionary update sequence element #0 has length 1; 2 is required
It happened when I tried using a template tag like: {% 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
It happens too when I try to access on a hstore queryset:
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
The code is:
tmp = Item.objects.where(HE("kv").contains({'key':value}))
if tmp.count() > 0:
item_id = tmp[0].id,
I’m just trying to access the value. I don’t understand the “update sequence” message. When I use a cursor instead of hstore queryset
, the function works. The error comes on template rendering too. I just restarted uwsgi
and everything works well, but the error comes back later.
2
17 Answers
Just ran into this problem. I don’t know if it’s the same thing that hit your code, but for me the root cause was because I forgot to put name=
on the last argument of the url
(or path
in Django 2.0+) function call.
For instance, the following functions throw the error from the question:
url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), 'foo')
path('foo/{slug:bar}/', views.FooBar, 'foo')
But these actually work:
url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), name="foo")
path('foo/{slug:bar}/', views.FooBar, name="foo")
The reason why the traceback is unhelpful is because internally, Django wants to parse the given positional argument as the keyword argument kwargs
, and since a string is an iterable, an atypical code path begins to unfold. Always use name=
on your urls!
8
This answer is very good because it covers an obscure error that is difficult to figure out. Even seasoned Django developers may fall in this particular trap.
– glarrainEspecially if you also use the
Router.register
method of Django RestFramework. It looks very similar, the difference is thename
kwarg…well that’s half an hour spent unproductively that would never come back. tnx.
awesome! thx! I was testing a lot but didnt see this kwarg thing .. phuuuu
– AndyFYI I also received this error using Django 2.0 style
path
URL. Forgot to use the kwarg and had this:path('foo/', views.foo, 'foo')
. I had to change topath('foo/', views.foo, name='foo')
– inostia
I got this error when I was messing around with string and dictionary.
dict1 = {'taras': 'vaskiv', 'iruna': 'vaskiv'}
str1 = str(dict1)
dict(str1)
*** ValueError: dictionary update sequence element #0 has length 1; 2 is required
So what you actually got to do to get dict from string is:
dic2 = eval(str1)
dic2
{'taras': 'vaskiv', 'iruna': 'vaskiv'}
Or in matter of security we can use literal_eval
from ast import literal_eval
2
Is there any other way to do this?
Yes, use
json.loads(dict1)
. Usingeval
can pose security risks– duhaime
Error in your question is raised when you try something like following:
>>> 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
It’s hard to tell where is the cause in your code unless you show your code, full traceback.
5
This confirms that the cause is not included in the question.
Thanks for the answer next time I will copy the traceback, but it’s weird, when it happened with the template tag, just after uwsgi restart, the result displayed properly, so there was result
–@user2575627, Why don’t you post code/traceback now? Update (edit) your question.
– falsetruSorry, I didn’t post code/traceback because it was urgent to repair/fix the service, so I didn’t copy the traceback the first time
–@user2575627, Could you post codes around /home/name/workspace/project/app/data/commands/my_command.py line 60?
– falsetru
I faced the above mentioned problem when I forgot to pass a keyword argument name to url() function.
Code with error
url(r"^testing/$", views.testing, "testing")
Code without error
url(r"^testing/$", views.testing, name="testing")
So finally I removed the above error in this way. It might be something different in your case. So check your url patterns in urls.py.
2
2019 and the same stackoverflow answer still saves me every time
Yeah, thank you v much. SO is really a great platform for developers, scientists and others.
– hygull
Here is how I encountered this error in Django and fixed it:
Code with error
urlpatterns = [path('home/', views.home, 'home'),]
Correction
urlpatterns = [path('home/', views.home, name="home"),]
2
This happened to me as well, thank you! Do we know what is going on here?
@ValidusOculus I am not very sure, looks like you have to use kwargs. You can read more about it here docs.djangoproject.com/en/4.0/ref/urls
Solution»
Pass a keyword argument name with value as your view name e.g home
or home-view
etc. to url()
function.
Throws Error»
url(r'^home$', 'common.views.view1', 'home'),
Correct»
url(r'^home$', 'common.views.view1', name="home"),
Here is the reproduced error.
>>> 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
>>>
If you give the sequence and any element length is 1 and required two then we will get this kind of error.
See the above code. First time I gave the sequence with tuple and it’s length 1, then we got the error and dictionary is not updated. second time I gave inside tuple with with two elements, dictionary got updated.
1
I’m getting the same error using shortucts.redirect and trying to send the response to an external page.. e.g. ‘ [code] return redirect(“msn.com”)[/code]
– roblem
I got the same issue and found that it was due to wrong parameters.
In views.py
, I used:
return render(request, 'demo.html',{'items', items})
But I found the issue: {'items', items}
. Changing to {'items': items}
resolved the issue.
In my case, my get_context_data
in one of my views was returning return render(self.request, 'es_connection_error.html', {'error':error});
in a try/catch block instead of returning context
The error should be with the params. Please verify that the params is a dictionary object. If it is just a list/tuple of arguments use only one * (*params
) instead of two * (**params
). This will explode the list/tuple into the proper amount of arguments.
Or, if the params is coming from some other part of code as a JSON file, please do json.loads(params)
, because the JSON objects sometimes behave as string and so you need to make it as a JSON using load from string (loads).
super(HStoreDictionary, self).__init__(value, **params)
Hope this helps!
I encountered this issue when trying to invoke the update method with a parameter of a wrong type.
The expected dict was:
{'foo': True}
The one that was passed was:
{'foo': "True"}
make sure you check all the parameters you pass are of the expected type.
I too had a similar type of problem . The solution is simple . just dont try to enter NULL or None value in values or u might have to use Something like thisdic.update([(key,value)])
check in your dictionary whether if you have single or double Quotation mark in your key or value!
dict1 = {'hello': 'world', 'programmer's': 'have girlfriend'}
to resolve it you can simply convert your dictionary in to string and then use replace method!
Another scenario that causes this error:
dict('{"a":1}') # gives the error
One way to achieve what you want is to use eval
eval('{"a":1}') # gives {"a":1}
You are sending one parameter incorrectly; it should be a dictionary object
:
Wrong:
func(a=r)
Correct:
func(a={'x':y})
I hit this error calling:
dict(my_data)
I fixed this with:
import json
json.loads(my_data)
This behavior will also occurs when using get_or_create
method in the following example below one will obviously get that error:
state,_ = Status.objects.get_or_create('Pending')
To resolve this you will add the the respective key and value.
i.e like this state,_ = Status.objects.get_or_create(name="Pending")
1
Life saver! Needed this.
Please post the code that shows what’s in
values
andtmp
. While code is missing, -1 (possibly temporary) for this question.I will add it as a comment. I got the error because I used a list instead of tuple. This raises the error:
dict(['A',"b"])
while this doesn’tdict([('A',"b")])