Fout: “woordenboek update sequentie-element #0 heeft lengte 1; 2 is vereist” op Django 1.4

Ik heb een foutmelding op django 1.4:

woordenboek update volgorde element #0 heeft lengte 1; 2 is vereist

[EDIT]

Het gebeurde toen ik probeerde een sjabloontag te gebruiken zoals: `{% 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

Het gebeurt ook als ik toegang probeer te krijgen tot een hstore-queryset:

[bewerken]

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

de code is:

tmp = Item.objects.where(HE("kv").contains({'key':value}))
if tmp.count() > 0:
    item_id = tmp[0].id,

Ik probeer alleen toegang te krijgen tot de waarde. Ik begrijp het bericht “updatevolgorde” niet. Wanneer ik een cursor gebruik in plaats van hstore queryset, werkt de functie. De fout treedt ook op bij het renderen van sjablonen. Ik heb zojuist uwsgiopnieuw opgestart en alles werkt goed, maar de fout komt later terug.

[bewerken]

Heeft iemand een idee?


Antwoord 1, autoriteit 100%

Ik kwam zojuist dit probleem tegen. Ik weet niet of het hetzelfde is dat je code heeft geraakt, maar voor mij was de hoofdoorzaak omdat ik vergat name=op het laatste argument van de urlte zetten (of pathin Django 2.0+) functieaanroep.

Bijvoorbeeld, de volgende functies veroorzaken de fout van de vraag:

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

Maar deze werken echt:

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

De reden waarom de traceback nutteloos is, is omdat Django intern het gegeven positionele-argument wil ontleden als het trefwoord-argument kwargs, en aangezien een string een iterable is, begint zich een atypisch codepad te ontvouwen. Gebruik altijd name=op je URL’s!


Antwoord 2, autoriteit 14%

Ik kreeg deze foutmelding toen ik aan het rommelen was met strings en woordenboek.

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

Dus wat je eigenlijk moet doen om dictaat van string te krijgen is:

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

Of als het om beveiliging gaat, kunnen we literal_eval gebruiken

from ast import literal_eval

Antwoord 3, autoriteit 6%

Er is een fout opgetreden in uw vraag wanneer u iets als het volgende probeert:

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

Het is moeilijk te zeggen waar de oorzaak in uw code zit, tenzij u uw code laat zien, volledige traceerbaarheid.


Antwoord 4, autoriteit 4%

Ik kreeg te maken met het bovengenoemde probleem toen ik vergat een zoekwoordargument namedoor te geven aan de url()-functie.

Code met fout

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

Code zonder fouten

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

Dus uiteindelijk heb ik de bovenstaande fout op deze manier verwijderd. Het kan in jouw geval iets anders zijn. Controleer dus uw URL-patronen in urls.py.


Antwoord 5, autoriteit 2%

Oplossing»

Geef een zoekwoordargument namemet waarde als uw weergavenaam door, bijvoorbeeld homeof home-viewenz. aan url()functie.

Gooifout»

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

JUIST »

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


Antwoord 6, Autoriteit 2%

Hier is de gereproduceerde fout.

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

Als u de reeks geeft en elke elementlengte 1 is en er twee nodig is, krijgen we dit soort fouten.
Zie de bovenstaande code. De eerste keer dat ik de reeks gaf met tuple en het is lengte 1, dan hebben we de fout en het woordenboek niet bijgewerkt. Tweede keer gaf ik binnen Tuple met met twee elementen, Woordenboek werd bijgewerkt.


Antwoord 7, Autoriteit 2%

Hier is hoe ik deze fout in Django tegenkwam en deze heeft opgelost:

Code met fout

urlpatterns = [path('home/', views.home, 'home'),]

Correctie

urlpatterns = [path('home/', views.home, name='home'),]

Antwoord 8

Ik heb hetzelfde probleem en ontdekte dat het te wijten was aan verkeerde parameters.
In views.py, ik heb gebruikt:

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

Maar ik heb het probleem gevonden: {'items', items}. Door over te schakelen naar {'items': items}is het probleem opgelost.


Antwoord 9

In mijn geval was mijn get_context_datain een van mijn weergaven het retourneren van return render(self.request, 'es_connection_error.html', {'error':error});in een try/catch-blok in plaats van context

te retourneren


Antwoord 10

De fout zou bij de parameters moeten liggen. Controleer of de params een woordenboekobject zijn. Als het slechts een lijst/tupel van argumenten is, gebruik dan slechts één * (*params) in plaats van twee * (**params). Dit zal de lijst/tuple exploderen in het juiste aantal argumenten.

Of, als de params uit een ander deel van de code komen als een JSON-bestand, voer dan json.loads(params)uit, omdat de JSON-objecten zich soms gedragen als string en dus moet u maak het als een JSON met behulp van load from string (loads).

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

Hopelijk helpt dit!


Antwoord 11

Ik kwam dit probleem tegen toen ik de updatemethode probeerde aan te roepen met een parameter van een verkeerd type.
Het verwachte dictaat was:

{'foo': True}

Degene die is geslaagd was:

{'foo': "True"}

zorg ervoor dat u controleert of alle parameters die u doorgeeft van het verwachte type zijn.


Antwoord 12

Ik had ook een soortgelijk probleem. De oplossing is simpel. probeer gewoon niet de waarde NULL of Geen in waarden in te voeren, anders moet u misschien zoiets gebruiken
dic.update([(key,value)])


Antwoord 13

Een ander scenario dat deze fout veroorzaakt:

dict('{"a":1}')  # gives the error

De juiste manier om te bereiken wat je wilt, is door eval

te gebruiken

eval('{"a":1}')  # gives {"a":1}

Antwoord 14

controleer in uw woordenboek of u een enkel of dubbel aanhalingsteken in uw sleutel of waarde heeft!

dict1 = {'hello': 'world', 'programmer's': 'have girlfriend'}

om het op te lossen, kunt u uw woordenboek eenvoudig converteren naar string en vervolgens de vervangmethode gebruiken!


Antwoord 15

U verzendt één parameter onjuist; het moet een dictionary objectzijn:

  • Fout:func(a=r)

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


Antwoord 16

Ik kreeg deze foutmelding bij het bellen:

dict(my_data)

Ik heb dit opgelost met:

import json
json.loads(my_data)

Antwoord 17

Dit gedrag zal ook optreden bij het gebruik van de get_or_createmethode in het volgende voorbeeld hieronder, men krijgt uiteraard die fout:

state,_ = Status.objects.get_or_create('Pending')

Om dit op te lossen, voegt u de respectievelijke sleutel en waarde toe.

d.w.z. zoals deze state,_ = Status.objects.get_or_create(name='Pending')

Other episodes