Errore: "l'elemento sequenza numero aggiornamento dizionario 0 ha lunghezza 1; 2 è richiesto "su Django 1.4


157

Ho un messaggio di errore su django 1.4:

la sequenza di aggiornamento del dizionario elemento # 0 ha lunghezza 1; 2 è richiesto

[MODIFICARE]

È successo quando ho provato a utilizzare un tag modello come: `{% per v nei valori%}:

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

Succede anche quando provo ad accedere a un queryset hstore:

[modificare]

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

il codice è:

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

if tmp.count() > 0:

    item_id = tmp[0].id,

Sto solo cercando di accedere al valore. Non capisco il messaggio "aggiorna sequenza". Quando utilizzo un cursore anziché il queryset hstore, la funzione funziona. L'errore si verifica anche sul rendering del modello. Ho appena riavviato uwsgie tutto funziona bene, ma l'errore ritorna più tardi.

[modificare]

Qualcuno ha un'idea?


Si prega di inserire il codice che mostra cosa c'è dentro valuese tmp. Mentre manca il codice, -1 (possibilmente temporaneo) per questa domanda.
ElmoVanKielmo il

Lo aggiungerò come commento. Ho ricevuto l'errore perché ho usato un elenco invece di tupla. Ciò solleva l'errore: dict(['A',"b"])mentre ciò non accadedict([('A',"b")])
NelsonGon,

Risposte:


397

Ho appena riscontrato questo problema. Non so se è la stessa cosa che ha colpito il tuo codice, ma per me la causa principale è stata perché ho dimenticato di mettere name=l'ultimo argomento della chiamata di funzione url(o pathin Django 2.0+).

Ad esempio, le seguenti funzioni generano l'errore dalla domanda:

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

Ma questi funzionano davvero:

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

Il motivo per cui la traceback è inutile perché internamente, Django vuole analizzare il dato posizionale argomento come parola chiave argomento kwargs, e dal momento che una stringa è un iterabile, un percorso di codice atipico comincia a svilupparsi. Usa sempre i name=tuoi URL!


40
Questa risposta è molto buona perché copre un oscuro errore che è difficile da capire. Anche gli sviluppatori Django esperti potrebbero cadere in questa trappola particolare.
Glarrain,

4
Soprattutto se usi anche il Router.registermetodo di Django RestFramework. Sembra molto simile, la differenza è il namekwarg ...
Risadinha,

4
beh è trascorsa mezz'ora improduttivamente che non sarebbe più tornata. tnx.
Iman Akbari,

2
Brillante! Esattamente quello che ho dimenticato: S
rschwieb,

2
Cordiali saluti, ho anche ricevuto questo errore utilizzando l' pathURL di stile Django 2.0 . Hai dimenticato di usare il kwarg e aveva questo: path('foo/', views.foo, 'foo'). Ho dovuto passare apath('foo/', views.foo, name='foo')
inostia il

38

Ho avuto questo errore quando stavo scherzando con stringa e dizionario.

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

Quindi quello che devi effettivamente fare per ottenere il comando dalla stringa è:

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

O in materia di sicurezza possiamo usare literal_eval

from ast import literal_eval

C'è un altro modo di fare questo?
Adam Shamsudeen,

28

Si verifica un errore nella domanda quando si tenta qualcosa di simile al seguente:

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

È difficile dire dov'è la causa nel tuo codice a meno che tu non mostri il tuo codice, traceback completo.


5
Ciò conferma che la causa non è inclusa nella domanda.
ElmoVanKielmo il

Grazie per la risposta la prossima volta copierò il traceback, ma è strano, quando è successo con il tag template, subito dopo il riavvio di uwsgi, il risultato è stato visualizzato correttamente, quindi c'è stato un risultato
user2575627

2
@ user2575627, Perché non pubblichi codice / traceback ora? Aggiorna (modifica) la tua domanda.
falsetru,

Spiacenti, non ho pubblicato codice / traceback perché era urgente riparare / riparare il servizio, quindi non ho copiato il traceback la prima volta
user2575627

@ user2575627, potresti pubblicare i codici in /home/name/workspace/project/app/data/commands/my_command.py linea 60?
falsetru,

18

Ho riscontrato il problema sopra menzionato quando ho dimenticato di passare un nome argomento della parola chiave alla funzione url ().

Codice con errore

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

Codice senza errori

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

Quindi alla fine ho rimosso l'errore sopra riportato in questo modo. Potrebbe essere qualcosa di diverso nel tuo caso. Così controllare i vostri modelli di URL in urls.py .


1
Il 2019 e la stessa risposta StackOverflow mi salva ancora ogni volta
Long Nguyen,

Sì, grazie v molto. SO è davvero un'ottima piattaforma per sviluppatori, scienziati e altri.
Gabbiano,

10

Soluzione"

Passa un nome argomento della parola chiave con valore come nome della vista, ad esempio homeo home-viewecc. Per url()funzionare.

Genera errore »

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

Corretta"

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


9

Ecco l'errore riprodotto.

>>> 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 si dà la sequenza e qualsiasi lunghezza dell'elemento è 1 e ne sono richiesti due, si otterrà questo tipo di errore. Vedi il codice sopra. La prima volta che ho dato la sequenza con tupla ed è lunghezza 1, quindi abbiamo ottenuto l'errore e il dizionario non è stato aggiornato. la seconda volta che ho dato una tupla interna con due elementi, il dizionario è stato aggiornato.


Ricevo lo stesso errore utilizzando shortucts.redirect e provando a inviare la risposta a una pagina esterna. Ad es. '[Code] return redirect (" msn.com") [/ code]
roblem,

3

Ho avuto lo stesso problema e ho scoperto che era dovuto a parametri errati. In views.py, ho usato:

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

Ma ho trovato il problema: {'items', items}. Modifica per {'items': items}risolvere il problema.


2

Nel mio caso, il mio get_context_datain una delle mie viste stava tornando return render(self.request, 'es_connection_error.html', {'error':error});in un blocco try / catch invece di tornarecontext


2

L'errore dovrebbe essere con i parametri. Verifica che params sia un oggetto dizionario . Se è solo un elenco / tupla di argomenti usa solo uno * ( *params) anziché due * (**params ). Questo esploderà la lista / tupla nella giusta quantità di argomenti.

Oppure, se i parametri provengono da un'altra parte del codice come file JSON, per favore json.loads(params), perché gli oggetti JSON a volte si comportano come stringa e quindi è necessario renderlo come JSON usando load from string (load).

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

Spero che questo ti aiuti!


1

Ho riscontrato questo problema durante il tentativo di invocare il metodo di aggiornamento con un parametro di tipo errato. Il dict atteso era:

{'foo': True}

Quello che è stato superato è stato:

{'foo': "True"}

assicurati di controllare che tutti i parametri che passi siano del tipo previsto.


0

Stai inviando un parametro in modo errato; dovrebbe essere un dictionary object:

  • Sbagliato: func(a=r)

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


0

Anch'io ho avuto un tipo simile di problema. La soluzione è semplice semplicemente non provare a inserire il valore NULL o None nei valori o potresti dover usare qualcosa del genere
dic.update([(key,value)])

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.