Помилка: “елемент послідовності оновлення словника № 0 має довжину 1; 2 потрібно »на Django 1.4


157

У мене повідомлення про помилку на django 1.4:

Елемент послідовності оновлення словника № 0 має довжину 1; 2 потрібно

[EDIT]

Це сталося, коли я спробував використовувати тег шаблону на зразок: `{% for 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, функція працює. Помилка виникає і при візуалізації шаблонів. Я просто перезапустив uwsgiі все працює добре, але помилка повертається пізніше.

[редагувати]

Хтось має ідею?


Будь ласка, опублікуйте код, який показує, що є valuesі в tmp. Хоча код відсутній, -1 (можливо тимчасовий) для цього питання.
ElmoVanKielmo

Я додам це як коментар. Я отримав помилку, оскільки використовував список замість кортежу. Це піднімає помилку: dict(['A',"b"])поки цього не відбуваєтьсяdict([('A',"b")])
НельсонГон

Відповіді:


397

Щойно зіткнувся з цією проблемою. Я не знаю, чи це те саме, що потрапило у ваш код, але для мене першопричиною було те, що я забув поставити 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. Це виглядає дуже схоже, різниця - nameкварґ ...
Risadinha

4
ну це півгодини, витрачені непродуктивно, які ніколи не повернуться. tnx.
Іман Акбарі

2
Блискуче! Саме те, що я забув: S
rschwieb

2
FYI Я також отримав цю помилку, використовуючи 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

Отже, що ви насправді повинні зробити для отримання дикту від рядка:

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

Або з точки зору безпеки ми можемо використовувати literal_eval

from ast import literal_eval

Чи є якийсь інший спосіб зробити це?
adam shamsudeen

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

Важко сказати, в чому причина у вашому коді, якщо ви не покажете свій код, повний трекбек.


5
Це підтверджує, що причина не включена у запитання.
ElmoVanKielmo

Дякую за відповідь наступного разу, коли я скопіюю трекбек, але це дивно, коли це сталося з тегом шаблону, відразу після перезавантаження uwsgi, результат відобразився належним чином, тому був результат
user2575627

2
@ user2575627, Чому зараз ви не опублікуєте код / ​​прослідкування? Оновіть (відредагуйте) своє запитання.
фальсетру

Вибачте, я не опублікував код / ​​traceback, тому що потрібно було терміново відремонтувати / виправити послугу, тому я не скопіював
traceback

@ user2575627, Чи можете ви розмістити коди навколо /home/name/workspace/project/app/data/commands/my_command.py рядок 60?
фальсетру

18

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

Код з помилкою

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

Код без помилок

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

Тож нарешті я таким чином усунув вищезгадану помилку. У вашому випадку це може бути щось інше. Так перевірити шаблони URL в urls.py .


1
2019 та та сама відповідь
Довгий Нгуен

Так, дякую вам багато. 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, потім ми отримали помилку і словник не оновлюється. Вдруге я дав всередині кортежу з двома елементами, словник оновився.


Я отримую ту саму помилку за допомогою shorttucts.redirect і намагаюся надіслати відповідь на зовнішню сторінку .. напр. '[Code] return redirect (" msn.com") [/ code]
roblem

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});в блоці спробу / лову замість поверненняcontext


2

Помилка повинна бути з парами. Перевірте, чи парами є об’єктом словника . Якщо це лише список / кортеж аргументів, використовуйте лише один * ( *params) замість двох * ( **params). Це призведе до вибуху списку / кортежу до належної кількості аргументів.

Або, якщо парами надходять із якоїсь іншої частини коду як файл JSON, будь ласка, зробіть це json.loads(params), тому що об'єкти JSON іноді поводяться як рядкові, тому вам потрібно зробити це як JSON, використовуючи навантаження з рядка (навантажень).

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

Сподіваюся, це допомагає!


1

Я зіткнувся з цією проблемою, намагаючись викликати метод оновлення з параметром неправильного типу. Очікуваний дикт був:

{'foo': True}

Пройдене було:

{'foo': "True"}

переконайтеся, що ви перевіряєте всі параметри, які ви передаєте, очікуваного типу.


0

Ви надсилаєте один параметр неправильно; це має бути dictionary object:

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

  • Правильно: func(a={'x':y})


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.