Błąd: „element sekwencji aktualizacji słownika nr 0 ma długość 1; 2 jest wymagane ”w Django 1.4

157

Mam komunikat o błędzie na django 1.4:

element sekwencji aktualizacji słownika # 0 ma długość 1; 2 jest wymagane

[EDYTOWAĆ]

Stało się tak, gdy próbowałem użyć tagu szablonu, takiego jak: `{% 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

Dzieje się tak również, gdy próbuję uzyskać dostęp do zestawu zapytań hstore:

[edytować]

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

kod to:

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

if tmp.count() > 0:

    item_id = tmp[0].id,

Po prostu próbuję uzyskać dostęp do wartości. Nie rozumiem komunikatu „sekwencja aktualizacji”. Kiedy używam kursora zamiast hstore queryset, funkcja działa. Błąd występuje również podczas renderowania szablonu. Właśnie zrestartowałem uwsgii wszystko działa dobrze, ale błąd wraca później.

[edytować]

Czy ktoś ma pomysł?

user2575627
źródło
Opublikuj kod, który pokazuje, co jest w valuesi tmp. Podczas gdy brakuje kodu, -1 (prawdopodobnie tymczasowe) dla tego pytania.
ElmoVanKielmo
Dodam to jako komentarz. Wystąpił błąd, ponieważ zamiast krotki użyłem listy. To rodzi błąd: dict(['A',"b"])chociaż tak nie jestdict([('A',"b")])
NelsonGon

Odpowiedzi:

397

Właśnie napotkałem ten problem. Nie wiem, czy to to samo, co uderzyło w twój kod, ale dla mnie główną przyczyną było to, że zapomniałem wstawić name=ostatni argument wywołania funkcji url(lub pathw Django 2.0+).

Na przykład następujące funkcje zgłaszają błąd z pytania:

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

Ale te faktycznie działają:

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

Powodem, dla którego śledzenie zwrotne nie jest pomocne, jest to, że wewnętrznie Django chce przeanalizować podany argument pozycyjny jako argument słowa kluczowegokwargs , a ponieważ łańcuch jest iterowalny, nietypowa ścieżka kodu zaczyna się rozwijać. Zawsze używaj name=w swoich adresach URL!

Thane Brimhall
źródło
40
Ta odpowiedź jest bardzo dobra, ponieważ obejmuje niejasny błąd, który jest trudny do odgadnięcia. Nawet doświadczeni programiści Django mogą wpaść w tę konkretną pułapkę.
glarrain
4
Zwłaszcza jeśli używasz również Router.registermetody Django RestFramework. Wygląda bardzo podobnie, różnica jest namekwarg ...
Risadinha
4
cóż, to pół godziny spędzonej bezproduktywnie, która nigdy nie wróci. tnx.
Iman Akbari,
2
Znakomity! Dokładnie to, o czym zapomniałem: S
rschwieb
2
FYI Otrzymałem również ten błąd przy użyciu pathadresu URL w stylu Django 2.0 . Zapomniał użyć kwarg i miał to: path('foo/', views.foo, 'foo'). Musiałem przesiąść się napath('foo/', views.foo, name='foo')
inostia
38

Pojawił się ten błąd, kiedy bawiłem się ciągiem znaków i słownikiem.

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

Więc to, co tak naprawdę musisz zrobić, aby uzyskać dict ze stringa, to:

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

Lub jeśli chodzi o bezpieczeństwo, możemy użyć literal_eval

from ast import literal_eval
Taras Vaskiv
źródło
Czy jest inny sposób, aby to zrobić?
adam shamsudeen
28

Błąd w twoim pytaniu pojawia się, gdy spróbujesz czegoś takiego jak:

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

Trudno powiedzieć, gdzie jest przyczyna w twoim kodzie, chyba że pokażesz swój kod, pełne śledzenie.

falsetru
źródło
5
Potwierdza to, że przyczyna nie została uwzględniona w pytaniu.
ElmoVanKielmo
Dzięki za odpowiedź następnym razem skopiuję traceback, ale to dziwne, jak to się stało z tagiem szablonu, zaraz po restarcie uwsgi wynik wyświetlał się poprawnie, więc był wynik
user2575627
2
@ user2575627, Dlaczego nie wyślesz teraz kodu / śledzenia wstecznego? Zaktualizuj (edytuj) swoje pytanie.
falsetru
Przepraszam, nie wysłałem kodu / śledzenia wstecznego, ponieważ naprawa / naprawa usługi była pilna, więc nie skopiowałem śledzenia za pierwszym razem
user2575627
@ user2575627, Czy możesz wysyłać kody w /home/name/workspace/project/app/data/commands/my_command.py linii 60?
falsetru
18

Napotkałem wyżej wymieniony problem, gdy zapomniałem przekazać nazwę argumentu słowa kluczowego do funkcji url ().

Kod z błędem

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

Kod bez błędów

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

W końcu w ten sposób usunąłem powyższy błąd. W twoim przypadku może być coś innego. Więc sprawdzić wzorców adresów URL w urls.py .

kadłub
źródło
1
2019 i ta sama odpowiedź
Long Nguyen
Tak, bardzo dziękuję. SO to naprawdę świetna platforma dla programistów, naukowców i innych.
hygull
10

Rozwiązanie"

Przekaż nazwę argumentu słowa kluczowego z wartością jako nazwą widoku, np. homeLub home-viewitp. Do url()funkcji.

Zgłasza błąd »

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

Poprawny"

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

Benjamin McIntire
źródło
9

Oto odtworzony błąd.

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

Jeśli podasz sekwencję i długość dowolnego elementu wynosi 1, a wymagane są dwa, otrzymamy tego rodzaju błąd. Zobacz powyższy kod. Pierwszy raz podałem sekwencję z krotką i jej długością 1, po czym otrzymaliśmy błąd i słownik nie jest aktualizowany. za drugim razem podałem wewnętrzną krotkę z dwoma elementami, słownik został zaktualizowany.

neotam
źródło
Otrzymuję ten sam błąd podczas korzystania z shortucts.redirect i próbuję wysłać odpowiedź na zewnętrzną stronę ... np. „[Kod] przekierowanie powrotu (" msn.com ") [/ kod]
roblem
3

Mam ten sam problem i stwierdziłem, że jest to spowodowane niewłaściwymi parametrami. W views.py, użyłem:

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

Ale znalazłem problem: {'items', items}. Zmiana w celu {'items': items}rozwiązania problemu.

Binoy Babu
źródło
2

W moim przypadku mój get_context_dataw jednym z moich widoków wracał return render(self.request, 'es_connection_error.html', {'error':error});w bloku try / catch zamiast powrotucontext

shadi
źródło
2

Błąd powinien dotyczyć parametrów. Sprawdź, czy parametry są obiektem słownika . Jeśli jest to tylko lista / krotka argumentów, użyj tylko jednej * ( *params) zamiast dwóch * ( **params). Spowoduje to rozbicie listy / krotki na odpowiednią liczbę argumentów.

Lub, jeśli parametry pochodzą z innej części kodu jako plik JSON, zrób to json.loads(params), ponieważ obiekty JSON czasami zachowują się jak ciąg znaków, więc musisz zrobić to jako JSON, używając funkcji load from string (ładuje).

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

Mam nadzieję że to pomoże!

Midhun C Nair
źródło
1

Napotkałem ten problem, próbując wywołać metodę aktualizacji z parametrem niewłaściwego typu. Oczekiwany dykt był:

{'foo': True}

Ten, który został przekazany, to:

{'foo': "True"}

upewnij się, że wszystkie przekazywane parametry mają oczekiwany typ.

Nick Kobishev
źródło
0

Wysyłasz jeden parametr nieprawidłowo; powinien to być dictionary object:

  • Źle: func(a=r)

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

soField
źródło
0

Ja też miałem podobny problem. Rozwiązanie jest proste. po prostu nie próbuj wpisywać wartości NULL lub None w wartościach, bo może być konieczne użycie czegoś takiego
dic.update([(key,value)])

yunus
źródło