Kesalahan: “elemen urutan pembaruan kamus # 0 memiliki panjang 1; 2 diperlukan ”pada Django 1.4

157

Saya memiliki pesan kesalahan pada Django 1.4:

elemen urutan pembaruan kamus # 0 memiliki panjang 1; 2 diperlukan

[EDIT]

Itu terjadi ketika saya mencoba menggunakan tag templat seperti: `{% 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

Itu terjadi juga ketika saya mencoba mengakses pada queryset hstore:

[sunting]

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

kodenya adalah:

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

if tmp.count() > 0:

    item_id = tmp[0].id,

Saya hanya mencoba mengakses nilainya. Saya tidak mengerti pesan "urutan pembaruan". Ketika saya menggunakan kursor bukan queryset hstore, fungsinya bekerja. Kesalahan juga terjadi pada rendering template. Saya baru saja restart uwsgidan semuanya bekerja dengan baik, tetapi kesalahan kembali lagi nanti.

[sunting]

Ada yang punya ide?

pengguna2575627
sumber
Silakan kirim kode yang menunjukkan apa yang ada di valuesdan tmp. Sementara kode tidak ada, -1 (mungkin sementara) untuk pertanyaan ini.
ElmoVanKielmo
Saya akan menambahkannya sebagai komentar. Saya mendapat kesalahan karena saya menggunakan daftar alih-alih tuple. Ini menimbulkan kesalahan: dict(['A',"b"])sementara ini tidakdict([('A',"b")])
NelsonGon

Jawaban:

397

Baru saja mengalami masalah ini. Saya tidak tahu apakah itu hal yang sama yang mengenai kode Anda, tetapi bagi saya akar penyebabnya adalah karena saya lupa untuk menggunakan name=argumen terakhir dari pemanggilan fungsi url(atau pathdalam Django 2.0+).

Misalnya, fungsi-fungsi berikut melempar kesalahan dari pertanyaan:

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

Tetapi ini sebenarnya bekerja:

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

Alasan mengapa traceback tidak membantu adalah karena secara internal, Django ingin mengurai argumen posisi yang diberikan sebagai argumen kata kuncikwargs , dan karena string adalah iterable, jalur kode atipikal mulai terbuka. Selalu gunakan name=di url Anda!

Thane Brimhall
sumber
40
Jawaban ini sangat bagus karena mencakup kesalahan yang tidak diketahui yang sulit untuk dipecahkan. Bahkan pengembang Django berpengalaman mungkin jatuh dalam perangkap khusus ini.
glarrain
4
Apalagi jika Anda juga menggunakan Router.registermetode Django RestFramework. Terlihat sangat mirip, perbedaannya adalah namekwarg ...
Risadinha
4
baik itu menghabiskan setengah jam tidak produktif yang tidak akan pernah kembali. tnx.
Iman Akbari
2
Cemerlang! Persis apa yang saya lupa: S
rschwieb
2
FYI Saya juga menerima kesalahan ini menggunakan Django 2.0 style pathURL. Lupa untuk menggunakan kwarg dan memiliki ini: path('foo/', views.foo, 'foo'). Saya harus mengganti kepath('foo/', views.foo, name='foo')
inostia
38

Saya mendapatkan kesalahan ini ketika saya bermain-main dengan string dan kamus.

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

Jadi yang harus Anda lakukan untuk mendapatkan dict dari string adalah:

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

Atau dalam hal keamanan kita bisa menggunakan literal_eval

from ast import literal_eval
Taras Vaskiv
sumber
Apakah ada cara lain untuk melakukan hal ini?.
adam shamsudeen
28

Kesalahan dalam pertanyaan Anda muncul ketika Anda mencoba sesuatu seperti berikut:

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

Sulit untuk mengetahui di mana penyebab dalam kode Anda kecuali Anda menunjukkan kode Anda, traceback penuh.

falsetru
sumber
5
Ini menegaskan bahwa penyebabnya tidak termasuk dalam pertanyaan.
ElmoVanKielmo
Terima kasih atas jawabannya di lain waktu saya akan menyalin traceback, tapi aneh, ketika itu terjadi dengan tag template, tepat setelah uwsgi restart, hasilnya ditampilkan dengan benar, jadi ada hasilnya
user2575627
2
@ user2575627, Mengapa Anda tidak memposting kode / traceback sekarang? Perbarui (edit) pertanyaan Anda.
falsetru
Maaf, saya tidak memposting kode / traceback karena itu mendesak untuk memperbaiki / memperbaiki layanan, jadi saya tidak menyalin traceback pertama kali
user2575627
@ user2575627, Bisakah Anda memposting kode di sekitar /home/name/workspace/project/app/data/commands/my_command.py baris 60?
falsetru
18

Saya menghadapi masalah yang disebutkan di atas ketika saya lupa memberikan nama argumen kata kunci ke fungsi url ().

Kode dengan kesalahan

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

Kode tanpa kesalahan

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

Jadi akhirnya saya menghapus kesalahan di atas dengan cara ini. Mungkin ada sesuatu yang berbeda dalam kasus Anda. Jadi memeriksa pola url Anda di urls.py .

camar
sumber
1
2019 dan jawaban stackoverflow yang sama masih menyelamatkan saya setiap saat
Long Nguyen
Ya, terima kasih banyak. SO benar-benar platform hebat bagi pengembang, ilmuwan, dan lainnya.
hygull
10

Larutan"

Lulus argumen kata kunci nama dengan nilai sebagai pandangan nama Anda misalnya homeatau home-viewdll untuk url()fungsi.

Melempar Kesalahan »

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

Benar"

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

Benjamin McIntire
sumber
9

Inilah kesalahan yang direproduksi.

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

Jika Anda memberikan urutan dan panjang elemen apa pun adalah 1 dan diperlukan dua maka kita akan mendapatkan kesalahan semacam ini. Lihat kode di atas. Pertama kali saya memberi urutan dengan tuple dan panjangnya 1, lalu kami mendapat kesalahan dan kamus tidak diperbarui. kedua kalinya saya memberi di dalam tuple dengan dua elemen, kamus diperbarui.

Neotam
sumber
Saya mendapatkan kesalahan yang sama menggunakan shortucts.redirect dan mencoba mengirim respons ke halaman eksternal .. misalnya '[code] return redirect (" msn.com") [/ code]
roblem
3

Saya mendapat masalah yang sama dan menemukan bahwa itu karena parameter yang salah. Dalam views.py, saya menggunakan:

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

Tapi aku menemukan masalah ini: {'items', items}. Mengubah untuk {'items': items}menyelesaikan masalah.

Binoy Babu
sumber
2

Dalam kasus saya, pandangan saya get_context_datadi salah satu pandangan saya kembali return render(self.request, 'es_connection_error.html', {'error':error});dalam blok coba / tangkap alih-alih kembalicontext

shadi
sumber
2

Kesalahan harus dengan params. Harap verifikasi bahwa params adalah objek kamus . Jika hanya daftar / tupel argumen, gunakan hanya satu * ( *params) daripada dua * ( **params). Ini akan meledakkan daftar / tuple menjadi jumlah argumen yang tepat.

Atau, jika params berasal dari beberapa bagian lain dari kode sebagai file JSON, silakan lakukan json.loads(params), karena objek JSON terkadang berperilaku sebagai string dan oleh karena itu Anda perlu menjadikannya sebagai JSON menggunakan beban dari string (memuat).

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

Semoga ini membantu!

Midhun C Nair
sumber
1

Saya mengalami masalah ini ketika mencoba menjalankan metode pembaruan dengan parameter dari tipe yang salah. Dict yang diharapkan adalah:

{'foo': True}

Yang disahkan adalah:

{'foo': "True"}

pastikan Anda memeriksa semua parameter yang Anda lewati adalah dari tipe yang diharapkan.

Nick Kobishev
sumber
0

Anda salah mengirim satu parameter; itu harus dictionary object:

  • Salah: func(a=r)

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

soField
sumber
0

Saya juga memiliki jenis masalah yang serupa. Solusinya sederhana. tapi jangan coba memasukkan nilai NULL atau None ke nilai atau Anda mungkin harus menggunakan Sesuatu seperti ini
dic.update([(key,value)])

Yunus
sumber