Fehler: “Wörterbuchaktualisierungssequenzelement # 0 hat Länge 1; 2 ist erforderlich “auf Django 1.4

157

Ich habe eine Fehlermeldung auf Django 1.4:

Das Wörterbuchaktualisierungssequenzelement # 0 hat die Länge 1; 2 ist erforderlich

[BEARBEITEN]

Es passierte, als ich versuchte, ein Vorlagen-Tag wie das folgende zu verwenden: `{% für v in Werten%}:

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

Es passiert auch, wenn ich versuche, auf ein hstore-Abfrageset zuzugreifen:

[bearbeiten]

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

Der Code lautet:

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

if tmp.count() > 0:

    item_id = tmp[0].id,

Ich versuche nur, auf den Wert zuzugreifen. Ich verstehe die Meldung "Aktualisierungssequenz" nicht. Wenn ich einen Cursor anstelle von hstore queryset verwende, funktioniert die Funktion. Der Fehler tritt auch beim Rendern von Vorlagen auf. Ich habe gerade neu gestartet uwsgiund alles funktioniert gut, aber der Fehler kommt später zurück.

[bearbeiten]

Hat jemand eine Idee?

user2575627
quelle
Bitte posten Sie den Code, der zeigt, was in valuesund ist tmp. Während Code fehlt, -1 (möglicherweise vorübergehend) für diese Frage.
ElmoVanKielmo
Ich werde es als Kommentar hinzufügen. Ich habe den Fehler erhalten, weil ich eine Liste anstelle von Tupel verwendet habe. Dies wirft den Fehler auf: dict(['A',"b"])während dies nichtdict([('A',"b")])
NelsonGon

Antworten:

397

Bin gerade auf dieses Problem gestoßen. Ich weiß nicht, ob es dasselbe ist, das Ihren Code getroffen hat, aber für mich war die Hauptursache, dass ich vergessen habe, name=das letzte Argument des Funktionsaufrufs url(oder pathin Django 2.0+) anzugeben.

Zum Beispiel werfen die folgenden Funktionen den Fehler aus der Frage:

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

Aber diese funktionieren tatsächlich:

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

Der Grund , warum die Rückverfolgung ist nicht hilfreich, weil intern, will Django die gegebene analysieren Positions Argument als Schlüsselwort - Argument kwargs, und da eine Zeichenfolge ein iterable ist, ein atypisches Codepfad beginnt sich zu entfalten. Verwenden name=Sie immer auf Ihren URLs!

Thane Brimhall
quelle
40
Diese Antwort ist sehr gut, da sie einen undurchsichtigen Fehler abdeckt, der schwer herauszufinden ist. Selbst erfahrene Django-Entwickler könnten in diese besondere Falle tappen.
Glarrain
4
Vor allem, wenn Sie auch die Router.registerMethode von Django RestFramework verwenden. Es sieht sehr ähnlich aus, der Unterschied ist der namekwarg ...
Risadinha
4
Nun, das ist eine halbe Stunde, die unproduktiv verbracht wird und niemals zurückkehren würde. tnx.
Iman Akbari
2
Brillant! Genau das, was ich vergessen habe: S
rschwieb
2
Zu Ihrer Information Ich habe diesen Fehler auch über die pathURL im Django 2.0-Stil erhalten . Ich habe vergessen, den Kwarg zu benutzen und hatte folgendes : path('foo/', views.foo, 'foo'). Ich musste zupath('foo/', views.foo, name='foo')
inostia
38

Ich habe diesen Fehler erhalten, als ich mit String und Wörterbuch herumgespielt habe.

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

Was Sie also tatsächlich tun müssen, um ein Diktat aus dem String zu erhalten, ist:

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

Oder aus Sicherheitsgründen können wir literal_eval verwenden

from ast import literal_eval
Taras Vaskiv
quelle
Gibt es eine andere Möglichkeit, dies zu tun?
Adam Shamsudeen
28

Ein Fehler in Ihrer Frage wird ausgelöst, wenn Sie Folgendes versuchen:

>>> 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 ist schwer zu sagen, wo die Ursache in Ihrem Code liegt, es sei denn, Sie zeigen Ihren Code, vollständige Rückverfolgung.

falsetru
quelle
5
Dies bestätigt, dass die Ursache nicht in der Frage enthalten ist.
ElmoVanKielmo
Vielen Dank für die Antwort, wenn ich das nächste Mal den Traceback kopiere, aber es ist seltsam, wenn es mit dem Template-Tag passiert ist, kurz nach dem Neustart von uwsgi wird das Ergebnis richtig angezeigt, also gab es ein Ergebnis
user2575627
2
@ user2575627, Warum postest du jetzt nicht Code / Traceback? Aktualisieren (bearbeiten) Sie Ihre Frage.
Falsetru
Entschuldigung, ich habe keinen Code / Traceback gepostet, da es dringend
erforderlich war,
@ user2575627, Können Sie Codes in der Zeile 60 um /home/name/workspace/project/app/data/commands/my_command.py posten?
Falsetru
18

Ich stand vor der oben genannten Problem , wenn ich vergessen , ein Stichwort Argument übergeben Namen zu url () Funktion.

Code mit Fehler

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

Code ohne Fehler

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

Also habe ich endlich den obigen Fehler auf diese Weise behoben. In Ihrem Fall könnte es etwas anderes sein. So überprüfen Sie die URL - Muster in urls.py .

Hygull
quelle
1
2019 und die gleiche Stackoverflow-Antwort retten mich immer noch jedes Mal
Long Nguyen
Ja, vielen Dank. SO ist wirklich eine großartige Plattform für Entwickler, Wissenschaftler und andere.
Hygull
10

Lösung"

Übergeben Sie einen Schlüsselwort - Argument Name mit Wert als Ansichtsnamen zB homeoder home-viewetc. url()Funktion.

Wirft Fehler »

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

Richtig"

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

Benjamin McIntire
quelle
9

Hier ist der reproduzierte Fehler.

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

Wenn Sie die Sequenz angeben und eine Elementlänge 1 ist und zwei benötigt, wird diese Art von Fehler angezeigt. Siehe den obigen Code. Als ich die Sequenz zum ersten Mal mit Tupel und ihrer Länge 1 angegeben habe, haben wir den Fehler erhalten und das Wörterbuch wurde nicht aktualisiert. Das zweite Mal, als ich ein Insider-Tupel mit zwei Elementen gab, wurde das Wörterbuch aktualisiert.

Neotam
quelle
Ich erhalte den gleichen Fehler mit shortucts.redirect und versuche, die Antwort an eine externe Seite zu senden. ZB '[code] return redirect (" msn.com") [/ code]
roblem
3

Ich habe das gleiche Problem festgestellt und festgestellt, dass es an falschen Parametern liegt. In habe views.pyich verwendet:

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

Aber ich fand das Problem : {'items', items}. Ändern, {'items': items}um das Problem zu beheben.

Binoy Babu
quelle
2

In meinem Fall kehrte meine get_context_dataAnsicht in einer meiner Ansichten return render(self.request, 'es_connection_error.html', {'error':error});in einem Try / Catch-Block zurück, anstatt zurückzukehrencontext

Shadi
quelle
2

Der Fehler sollte bei den Parametern liegen. Bitte stellen Sie sicher, dass die Parameter ein Wörterbuchobjekt sind . Wenn es sich nur um eine Liste / ein Tupel von Argumenten handelt, verwenden Sie nur ein * ( *params) anstelle von zwei * ( **params). Dadurch wird die Liste / das Tupel in die richtige Anzahl von Argumenten aufgelöst.

Wenn die Parameter aus einem anderen Teil des Codes als JSON-Datei stammen, tun Sie dies bitte json.loads(params) , da sich die JSON-Objekte manchmal als Zeichenfolge verhalten und Sie sie daher als JSON mithilfe von load from string (load) .

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

Hoffe das hilft!

Midhun C Nair
quelle
1

Dieses Problem trat auf, als ich versuchte, die Aktualisierungsmethode mit einem Parameter eines falschen Typs aufzurufen. Das erwartete Diktat war:

{'foo': True}

Derjenige, der bestanden wurde, war:

{'foo': "True"}

Stellen Sie sicher, dass alle übergebenen Parameter vom erwarteten Typ sind.

Nick Kobishev
quelle
0

Sie senden einen Parameter falsch. es sollte ein sein dictionary object:

  • Falsch: func(a=r)

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

soField
quelle
0

Ich hatte auch ein ähnliches Problem. Die Lösung ist einfach. Versuchen Sie einfach nicht, den Wert NULL oder None in die Werte einzugeben, da Sie sonst möglicherweise so etwas verwenden müssen
dic.update([(key,value)])

Yunus
quelle