Erro: “o elemento de sequência de atualização de dicionário # 0 tem comprimento 1; 2 é obrigatório ”no Django 1.4

157

Eu tenho uma mensagem de erro no django 1.4:

o elemento de sequência de atualização de dicionário # 0 tem comprimento 1; 2 é obrigatório

[EDITAR]

Aconteceu quando tentei usar uma tag de modelo como: `{% 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

Isso acontece também quando tento acessar um conjunto de consultas hstore:

[editar]

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

o código é:

tmp = Item.objects.where(HE("kv").contains({'key':value}))

if tmp.count() > 0:

    item_id = tmp[0].id,

Eu só estou tentando acessar o valor. Não entendo a mensagem "sequência de atualização". Quando eu uso um cursor em vez de hstore queryset, a função funciona. O erro também ocorre na renderização do modelo. Acabei de reiniciar uwsgie tudo funciona bem, mas o erro volta mais tarde.

[editar]

Alguém tem uma ideia?

user2575627
fonte
Poste o código que mostra o que está dentro valuese tmp. Enquanto o código estiver ausente, -1 (possivelmente temporário) para esta pergunta.
ElmoVanKielmo
Vou adicioná-lo como um comentário. Eu recebi o erro porque usei uma lista em vez de tupla. Isto levanta o erro: dict(['A',"b"])Enquanto isso nãodict([('A',"b")])
NelsonGon

Respostas:

397

Acabei de encontrar este problema. Não sei se foi a mesma coisa que atingiu seu código, mas para mim a causa principal foi porque esqueci de colocar name=o último argumento da chamada de função url(ou pathno Django 2.0+).

Por exemplo, as seguintes funções lançam o erro da pergunta:

url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), 'foo')
path('foo/{slug:bar}/', views.FooBar, 'foo')

Mas estes realmente funcionam:

url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), name='foo')
path('foo/{slug:bar}/', views.FooBar, name='foo')

A razão pela qual o traceback é inútil é porque internamente, o Django deseja analisar o argumento posicional fornecido como o argumento da palavra - chavekwargs e, como uma string é iterável, um caminho de código atípico começa a se desdobrar. Sempre use name=em seus URLs!

Thane Brimhall
fonte
40
Essa resposta é muito boa porque cobre um erro obscuro que é difícil de descobrir. Até desenvolvedores experientes do Django podem cair nessa armadilha em particular.
glarrain
4
Especialmente se você também usar o Router.registermétodo do Django RestFramework. Parece muito parecido, a diferença é o namekwarg ...
Risadinha
4
bem, são meia hora gastas improdutivamente que nunca voltariam. TNX.
Iman Akbari
2
Brilhante! Exatamente o que eu esqueci: S
rschwieb
2
Para sua informação, também recebi esse erro usando o pathURL do estilo Django 2.0 . Esqueceu-se de usar o kwarg e tinha a seguinte: path('foo/', views.foo, 'foo'). Eu tive que mudar parapath('foo/', views.foo, name='foo')
inostia 15/08/19
38

Eu recebi esse erro quando estava brincando com string e dicionário.

dict1 = {'taras': 'vaskiv', 'iruna': 'vaskiv'}
str1 = str(dict1)
dict(str1)
*** ValueError: dictionary update sequence element #0 has length 1; 2 is required

Então, o que você realmente precisa fazer para obter o dict da string é:

dic2 = eval(str1)
dic2
{'taras': 'vaskiv', 'iruna': 'vaskiv'}

Ou em questão de segurança, podemos usar literal_eval

from ast import literal_eval
Taras Vaskiv
fonte
Existe alguma outra maneira de fazer isso?
Shamsudeen adam
28

O erro na sua pergunta é gerado quando você tenta algo como o seguinte:

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

É difícil dizer qual é a causa do seu código, a menos que você mostre seu código, rastreamento completo.

falsetru
fonte
5
Isso confirma que a causa não está incluída na pergunta.
ElmoVanKielmo
Agradecimentos para a resposta da próxima vez vou copiar o rastreamento, mas é estranho, quando aconteceu com a tag modelo, logo após uwsgi reiniciar, o resultado exibido corretamente, então não havia resultado
user2575627
2
@ user2575627, Por que você não publica código / traceback agora? Atualize (edite) sua pergunta.
falsetru
Desculpe, eu fiz código não post / rastreamento, porque era urgente reparação / corrigir o serviço, então eu não copiar o rastreamento pela primeira vez
user2575627
@ user2575627, você poderia postar códigos na linha /home/name/workspace/project/app/data/commands/my_command.py linha 60?
falsetru
18

Eu enfrentei o problema acima mencionado quando esqueci de passar um nome de argumento de palavra-chave para a função url ().

Código com erro

 url(r"^testing/$", views.testing, "testing")

Código sem erro

url(r"^testing/$", views.testing, name="testing")

Então, finalmente, removi o erro acima dessa maneira. Pode ser algo diferente no seu caso. Portanto, verifique seus padrões de URL em urls.py .

hygull
fonte
1
2019 e a mesma resposta de stackoverflow ainda me salva sempre
Long Nguyen
Sim, muito obrigado. O SO é realmente uma ótima plataforma para desenvolvedores, cientistas e outros.
hygull
10

Solução"

Passe um nome de argumento de palavra-chave com valor como seu nome de exibição, por exemplo, homeou home-viewetc., para url()funcionar.

Lança erro »

url(r'^home$', 'common.views.view1', 'home'),

Corrigir"

url(r'^home$', 'common.views.view1', name='home'),

Benjamin McIntire
fonte
9

Aqui está o erro reproduzido.

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

Se você fornecer a sequência e qualquer comprimento de elemento for 1 e for necessário dois, obteremos esse tipo de erro. Veja o código acima. A primeira vez que dei a sequência com tupla e seu comprimento 1, obtivemos o erro e o dicionário não é atualizado. segunda vez que dei dentro da tupla com dois elementos, o dicionário foi atualizado.

neotam
fonte
Estou recebendo o mesmo erro usando shortucts.redirect e tentando enviar a resposta para uma página externa. Por exemplo, '[code] return redirect (" msn.com") [/ code]
roblem
3

Eu peguei o mesmo problema e achei que era devido a parâmetros incorretos. Em views.py, eu usei:

return render(request, 'demo.html',{'items', items})    

Mas eu encontrei o problema: {'items', items}. Alterando para {'items': items}resolver o problema.

Binoy Babu
fonte
2

No meu caso, meu get_context_dataem uma das minhas visualizações estava retornando return render(self.request, 'es_connection_error.html', {'error':error});em um bloco try / catch em vez de retornarcontext

shadi
fonte
2

O erro deve estar com os parâmetros. Verifique se os parâmetros são um objeto de dicionário . Se for apenas uma lista / tupla de argumentos, use apenas um * ( *params) em vez de dois * ( **params). Isso explodirá a lista / tupla na quantidade adequada de argumentos.

Ou, se os params vierem de alguma outra parte do código como um arquivo JSON, faça-o json.loads(params), porque os objetos JSON às vezes se comportam como string e, portanto, você precisa torná-lo como um JSON usando load from string (load).

super(HStoreDictionary, self).__init__(value, **params)

Espero que isto ajude!

Midhun C Nair
fonte
1

Encontrei esse problema ao tentar invocar o método de atualização com um parâmetro de um tipo errado. O ditado esperado era:

{'foo': True}

O que foi aprovado foi:

{'foo': "True"}

verifique se todos os parâmetros que você passa são do tipo esperado.

Nick Kobishev
fonte
0

Você está enviando um parâmetro incorretamente; deve ser um dictionary object:

  • Errado: func(a=r)

  • Corrigir: func(a={'x':y})

soField
fonte
0

Eu também tive um tipo semelhante de problema. A solução é simples. apenas não tente digitar o valor NULL ou None nos valores ou você pode ter que usar algo como isto
dic.update([(key,value)])

yunus
fonte