Error: "el elemento de secuencia de actualización del diccionario # 0 tiene longitud 1; 2 es obligatorio "en Django 1.4

157

Tengo un mensaje de error en django 1.4:

el elemento de secuencia de actualización del diccionario # 0 tiene longitud 1; Se requiere 2

[EDITAR]

Sucedió cuando intenté usar una etiqueta de plantilla 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

También sucede cuando intento acceder en un 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

el código es:

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

if tmp.count() > 0:

    item_id = tmp[0].id,

Solo estoy tratando de acceder al valor. No entiendo el mensaje "secuencia de actualización". Cuando uso un cursor en lugar de hstore queryset, la función funciona. El error también se produce en el renderizado de plantillas. Acabo de reiniciaruwsgi y todo funciona bien, pero el error vuelve más tarde.

[editar]

¿Alguien tiene una idea?

usuario2575627
fuente
Por favor enviar el código que muestra lo que está en valuesy tmp. Mientras falta el código, -1 (posiblemente temporal) para esta pregunta.
ElmoVanKielmo
Lo agregaré como un comentario. Obtuve el error porque usé una lista en lugar de tupla. Esto genera el error: dict(['A',"b"])mientras esto no lo hacedict([('A',"b")])
NelsonGon

Respuestas:

397

Acabo de encontrarme con este problema. No sé si es lo mismo que golpeó su código, pero para mí la causa raíz fue porque olvidé poner name=el último argumento de la url(opath llamada a la función en Django 2.0+).

Por ejemplo, las siguientes funciones arrojan el error de la pregunta:

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

Pero estos realmente funcionan:

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

La razón por la cual el rastreo no es útil es porque internamente, Django quiere analizar el argumento posicional dado como argumento de palabra clavekwargs , y dado que una cadena es iterable, una ruta de código atípica comienza a desarrollarse. ¡Úselo siempre name=en sus URL!

Thane Brimhall
fuente
40
Esta respuesta es muy buena porque cubre un error oscuro que es difícil de resolver. Incluso los desarrolladores experimentados de Django pueden caer en esta trampa particular.
glarrain
44
Especialmente si también usa el Router.registermétodo de Django RestFramework. Se ve muy similar, la diferencia es el namekwarg ...
Risadinha
44
bueno, eso es media hora gastada de manera improductiva que nunca volvería. tnx.
Iman Akbari
2
¡Brillante! Exactamente lo que olvidé: S
rschwieb
2
FYI también recibí este error usando la pathURL de estilo Django 2.0 . Se olvidó de usar el kwarg y tenía la siguiente: path('foo/', views.foo, 'foo'). Tuve que cambiar apath('foo/', views.foo, name='foo')
inostia
38

Recibí este error cuando estaba jugando con la cadena y el diccionario.

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

Entonces, lo que tienes que hacer para obtener dict de string es:

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

O en materia de seguridad podemos usar literal_eval

from ast import literal_eval
Taras Vaskiv
fuente
Hay alguna otra manera de hacer esto?
Adam Shamsudeen
28

Se produce un error en su pregunta cuando intenta algo como lo siguiente:

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

Es difícil saber dónde está la causa en su código a menos que muestre su código, rastreo completo.

falsetru
fuente
55
Esto confirma que la causa no está incluida en la pregunta.
ElmoVanKielmo
Gracias por la respuesta la próxima vez que copie el rastreo, pero es extraño, cuando sucedió con la etiqueta de la plantilla, justo después de reiniciar uwsgi, el resultado se mostró correctamente, por lo que hubo resultado
user2575627
2
@ user2575627, ¿por qué no publicas código / rastreo ahora? Actualiza (edita) tu pregunta.
falsetru
Lo sentimos, no publiqué el código / rastreo porque era urgente reparar / reparar el servicio, así que no
copié el rastreo
@ user2575627, ¿podría publicar códigos en /home/name/workspace/project/app/data/commands/my_command.py línea 60?
falsetru
18

Me enfrenté al problema mencionado anteriormente cuando olvidé pasar un nombre de argumento de palabra clave a la función url ().

Código con error

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

Código sin error

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

Así que finalmente eliminé el error anterior de esta manera. Puede ser algo diferente en su caso. A fin de comprobar sus patrones de URL en urls.py .

Hullull
fuente
1
2019 y la misma respuesta de stackoverflow todavía me salva cada vez
Long Nguyen
Sí, muchas gracias. SO es realmente una gran plataforma para desarrolladores, científicos y otros.
hygull
10

Solución"

Pase un nombre de argumento de palabra clave con valor como su nombre de vista, por ejemplo, homeo home-viewetc., aurl() funcione.

Lanza Error »

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

Correcto"

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

Benjamin McIntire
fuente
9

Aquí está el error reproducido.

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

Si proporciona la secuencia y la longitud de cualquier elemento es 1 y requiere dos, obtendremos este tipo de error. Ver el código de arriba. La primera vez que le di la secuencia con tupla y es de longitud 1, recibimos el error y el diccionario no se actualiza. La segunda vez que di tupla interior con dos elementos, el diccionario se actualizó.

neotam
fuente
Recibo el mismo error usando shortucts.redirect e intento enviar la respuesta a una página externa ... por ejemplo, '[código] return redirect (" msn.com") [/ code]
roblem
3

Tuve el mismo problema y descubrí que se debía a parámetros incorrectos. En views.py, usé:

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

Pero me encontré con el tema: {'items', items}. Cambiando para {'items': items}resolver el problema.

Binoy Babu
fuente
2

En mi caso, mi get_context_dataen una de mis vistas estaba regresando return render(self.request, 'es_connection_error.html', {'error':error});en un bloque try / catch en lugar de regresarcontext

Shadi
fuente
2

El error debería estar con los params. Verifique que los parámetros sean un objeto de diccionario . Si es solo una lista / tupla de argumentos, use solo un * ( *params) en lugar de dos * (**params ). Esto explotará la lista / tupla en la cantidad adecuada de argumentos.

O bien, si los parámetros provienen de otra parte del código como un archivo JSON, hágalo json.loads(params), porque los objetos JSON a veces se comportan como una cadena y, por lo tanto, debe hacerlo como JSON utilizando la carga de la cadena (cargas).

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

¡Espero que esto ayude!

Midhun C Nair
fuente
1

Encontré este problema al intentar invocar el método de actualización con un parámetro de un tipo incorrecto. El dict esperado era:

{'foo': True}

El que se aprobó fue:

{'foo': "True"}

asegúrese de verificar que todos los parámetros que pasa son del tipo esperado.

Nick Kobishev
fuente
0

Estás enviando un parámetro incorrectamente; debería ser un dictionary object:

  • Incorrecto: func(a=r)

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

soField
fuente
0

Yo también tuve un tipo de problema similar. La solución es simple. simplemente no intente ingresar un valor NULL o None en los valores o podría tener que usar algo como esto
dic.update([(key,value)])

Yunus
fuente