ข้อผิดพลาด:“ องค์ประกอบลำดับการอัพเดทพจนานุกรม # 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

มันเกิดขึ้นเช่นกันเมื่อฉันพยายามเข้าถึง hset queryset:

[แก้ไข]

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")])
NelsonGon

คำตอบ:


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

เหตุผลที่ว่าทำไม traceback คือช่วยเหลือเป็นเพราะภายใน Django ต้องการที่จะแยกที่ได้รับตำแหน่งอาร์กิวเมนต์เป็นคำหลักโต้แย้งkwargsและตั้งแต่สตริงเป็น iterable, เส้นทางรหัสผิดปกติเริ่มที่จะแฉ ใช้name=กับ URL ของคุณเสมอ!


40
คำตอบนี้ดีมากเพราะครอบคลุมข้อผิดพลาดที่คลุมเครือซึ่งยากที่จะเข้าใจ แม้แต่นักพัฒนา Django ที่มีประสบการณ์ก็อาจตกหลุมพรางนี้
glarrain

4
โดยเฉพาะถ้าคุณใช้Router.registerวิธีของ Django RestFramework มันดูคล้ายกันมากความแตกต่างก็คือnamekwarg ...
Risadinha

4
นั่นคือครึ่งชั่วโมงที่ใช้ไปโดยไม่มีประโยชน์ซึ่งจะไม่มีวันกลับมา TNX
Iman Akbari

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

มีวิธีอื่นที่จะทำเช่นนี้?
ดัม 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

ขอบคุณสำหรับคำตอบในครั้งต่อไปที่ฉันจะคัดลอก traceback แต่มันแปลกเมื่อมันเกิดขึ้นกับเทมเพลตแท็กหลังจากรีสตาร์ท uwsgi แล้วผลลัพธ์จะแสดงอย่างถูกต้องดังนั้นจึงมีผลลัพธ์
user2575627

2
@ user2575627 ทำไมคุณไม่โพสต์รหัส / การติดตามย้อนกลับตอนนี้ อัปเดต (แก้ไข) คำถามของคุณ
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


1
2019 และคำตอบส
ลองเหงียนยาว

ใช่ขอบคุณ v มาก ดังนั้นจึงเป็นแพลตฟอร์มที่ยอดเยี่ยมสำหรับนักพัฒนานักวิทยาศาสตร์และอื่น ๆ
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 และจำเป็นต้องมีสองข้อเราจะได้รับข้อผิดพลาดประเภทนี้ ดูรหัสข้างต้น ครั้งแรกที่ฉันให้ลำดับกับ tuple และมีความยาว 1 จากนั้นเราได้รับข้อผิดพลาดและไม่มีการอัปเดตพจนานุกรม ครั้งที่สองที่ฉันให้สิ่งอันดับสองกับสององค์ประกอบพจนานุกรมได้รับการปรับปรุง


ฉันได้รับข้อผิดพลาดเดียวกันโดยใช้ shortucts.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});ในบล็อก try / catch แทนที่จะกลับมาcontext


2

ข้อผิดพลาดควรอยู่กับ params โปรดตรวจสอบว่า params เป็นวัตถุพจนานุกรม หากเป็นเพียงลิสต์ / tuple ของอาร์กิวเมนต์ให้ใช้เพียงหนึ่ง * ( *params) แทนที่จะเป็นสอง * ( **params) สิ่งนี้จะกระจายรายการ / tuple เป็นจำนวนอาร์กิวเมนต์ที่เหมาะสม

หรือถ้าพารามิเตอร์มาจากส่วนอื่น ๆ ของรหัสเป็นไฟล์ 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 ในค่าหรือคุณอาจต้องใช้บางอย่างเช่นนี้
dic.update([(key,value)])

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.