Ошибка: «Элемент последовательности обновления словаря # 0 имеет длину 1; Требуется 2 »на Django 1.4

157

У меня есть сообщение об ошибке на Django 1.4:

элемент последовательности обновления словаря # 0 имеет длину 1; 2 требуется

[РЕДАКТИРОВАТЬ]

Это произошло, когда я попытался использовать тег шаблона, например: `{% для v в значениях%}:

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

Это также происходит, когда я пытаюсь получить доступ к набору запросов hstore:

[редактировать]

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

код:

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

if tmp.count() > 0:

    item_id = tmp[0].id,

Я просто пытаюсь получить доступ к значению. Я не понимаю сообщение "последовательность обновлений". Когда я использую курсор вместо hstore queryset, функция работает. Ошибка также возникает при рендеринге шаблона. Я просто перезапустил uwsgiи все работает хорошо, но ошибка возвращается позже.

[редактировать]

У кого-нибудь есть идея?

user2575627
источник
Пожалуйста, отправьте код, который показывает, что в valuesи tmp. Пока код отсутствует, -1 (возможно, временный) для этого вопроса.
ElmoVanKielmo
Я добавлю это как комментарий. Я получил ошибку, потому что я использовал список вместо кортежа. Это поднимает ошибку: dict(['A',"b"])пока это не такdict([('A',"b")])
NelsonGon

Ответы:

398

Просто столкнулся с этой проблемой. Я не знаю, произошло ли то же самое в вашем коде, но для меня основная причина была в том, что я забыл поставить name=последний аргумент вызова функции url(или pathв Django 2.0+).

Например, следующие функции выдают ошибку из вопроса:

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

Но они на самом деле работают:

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

Причина, по которой обратная связь бесполезна, заключается в том, что внутри Django хочет проанализировать данный позиционный аргумент как аргумент ключевого словаkwargs , а поскольку строка является итеративной, нетипичный путь кода начинает раскрываться. Всегда используйте name=на своих URL!

Тейн Бримхолл
источник
40
Этот ответ очень хорош, потому что он охватывает неясную ошибку, которую трудно понять. Даже опытные разработчики Django могут попасть в эту ловушку.
glarrain
4
Особенно если вы также используете Router.registerметод Django RestFramework. Это выглядит очень похоже, разница в namekwarg ...
Risadinha
4
ну, это полчаса, потраченных непродуктивно, которые никогда не вернутся. Тпй.
Иман Акбари
2
Brilliant! Именно то, что я забыл: S
rschwieb
2
К вашему сведению, я также получил эту ошибку, используя pathURL-адрес в стиле Django 2.0 . Забыла использовать kwarg и было это: path('foo/', views.foo, 'foo'). Я должен был измениться наpath('foo/', views.foo, name='foo')
Inostia
38

Я получил эту ошибку, когда возился со строкой и словарем.

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

Итак, что вы действительно должны сделать, чтобы получить dict из строки:

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

Или в вопросах безопасности мы можем использовать literal_eval

from ast import literal_eval
Тарас Васькив
источник
Есть ли другой способ сделать это?
Адам Шамсудин
28

Ошибка в вашем вопросе возникает, когда вы пытаетесь что-то вроде следующего:

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

Трудно сказать, где причина в вашем коде, если вы не показываете свой код, полный возврат.

falsetru
источник
5
Это подтверждает, что причина не включена в вопрос.
ElmoVanKielmo
Спасибо за ответ, в следующий раз я скопирую трассировку, но это странно, когда это случилось с тегом шаблона, сразу после перезапуска uwsgi, результат отображался правильно, поэтому был результат
user2575627
2
@ user2575627, почему бы тебе не опубликовать код / ​​traceback сейчас? Обновите (отредактируйте) свой вопрос.
Falsetru
Извините, я не отправлял код / ​​трассировку, потому что нужно было срочно восстановить / исправить сервис, поэтому я не копировал трассировку в первый раз
user2575627
@ user2575627, не могли бы вы разместить коды в /home/name/workspace/project/app/data/commands/my_command.py строка 60?
falsetru
18

Я столкнулся с вышеупомянутой проблемой, когда забыл передать имя аргумента ключевого слова в функцию url ().

Код с ошибкой

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

Код без ошибок

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

Итак, наконец, я удалил вышеуказанную ошибку таким способом. Это может быть что-то другое в вашем случае. Так проверить шаблоны URL в urls.py .

hygull
источник
1
2019 и тот же ответ
Long Nguyen
Да, спасибо тебе большое. SO действительно отличная платформа для разработчиков, ученых и других.
Hygull
10

Решение"

Передайте имя аргумента ключевого слова со значением в качестве имени вашего представления, например, homeили home-viewт. Д. Для url()работы.

Выдает ошибку »

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

Верный"

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

Бенджамин Макинтайр
источник
9

Вот воспроизведенная ошибка.

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

Если вы дадите последовательность и длина любого элемента будет равна 1, а потребуется два, то мы получим такую ​​ошибку. Смотрите приведенный выше код. В первый раз я дал последовательность с кортежем и ее длиной 1, затем мы получили ошибку и словарь не обновляется. Во второй раз я дал внутри кортежа с двумя элементами, словарь обновился.

neotam
источник
Я получаю ту же ошибку, используя shortucts.redirect и пытаюсь отправить ответ на внешнюю страницу. Например, '[code] return redirect (" msn.com") [/ code]
проблема
3

Я получил ту же проблему и обнаружил, что это из-за неправильных параметров. В views.pyя использовал:

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

Но я нашел вопрос {'items', items}. Изменение {'items': items}решило проблему.

Биной ​​Бабу
источник
2

В моем случае мой get_context_dataв одном из моих просмотров возвращался return render(self.request, 'es_connection_error.html', {'error':error});в блоке try / catch вместо возвратаcontext

Шади
источник
2

Ошибка должна быть с параметрами. Пожалуйста, убедитесь, что params является объектом словаря . Если это просто список / кортеж аргументов, используйте только один * ( *params) вместо двух * ( **params). Это взорвет список / кортеж в нужное количество аргументов.

Или, если параметры поступают из какой-то другой части кода в виде файла JSON, сделайте это json.loads(params), потому что объекты JSON иногда ведут себя как строки, и поэтому вам нужно сделать это как JSON, используя load from string (load).

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

Надеюсь это поможет!

Midhun C Nair
источник
1

Я столкнулся с этой проблемой при попытке вызвать метод обновления с параметром неправильного типа. Ожидаемый дикт был:

{'foo': True}

Тот, который был передан был:

{'foo': "True"}

убедитесь, что вы проверяете все параметры, которые вы передаете, ожидаемого типа.

Ник кобишев
источник
0

Вы отправляете один параметр неправильно; это должно быть dictionary object:

  • Неправильно: func(a=r)

  • Верный: func(a={'x':y})

Sofield
источник
0

У меня тоже был подобный тип проблемы. Решение простое. просто не пытайтесь вводить значения NULL или None в значениях, или вам, возможно, придется использовать что-то вроде этого
dic.update([(key,value)])

Юнуса
источник