Django视图中ORM get查询触发ValueError解包错误问题排查
Django ORM查询报错
ValueError: too many values to unpack (expected 2)原因及修复方案 报错根源
触发报错的核心原因是查询方法传参格式错误:
Django ORM的get()、filter()等查询API,不接受裸字符串形式的查询条件作为位置参数,需要传入键值对形式的关键字参数,或者Q对象包裹的查询表达式。
你写的Choice.choices.get("question_id=6")把完整查询条件写成了一个字符串传入,ORM内部解析位置参数时,会尝试将参数拆分为(字段名, 匹配值)的二元组,单个字符串被迭代后会得到多个字符元素,数量远大于2,直接触发拆包报错。
后续尝试加[0]索引的写法也不成立:get()方法的返回值是单个匹配的模型实例,不是列表或查询集,本身不支持下标索引,哪怕查询参数写对,加[0]也会触发对象不可下标的类型错误。
正确的条件查询写法
- 等值查询直接传关键字参数:参数名和模型字段名一致,等号两边不要加引号包裹,直接写键值对即可
# 查询question_id=6的单条记录 # 注意:get()要求查询结果必须有且仅有1条匹配记录,0条或多条都会抛异常 test = Choice.choices.get(question_id=6) # 拿到实例后直接点属性取字段值即可,不需要索引 print(test.question_text) - 不确定匹配结果数量时,用
filter()替代get():filter()返回可迭代的查询集,匹配结果为空也不会报错,取单条记录可以链式调用first()方法# 拿到所有question_id=6的记录组成的查询集 test_list = Choice.choices.filter(question_id=6) # 取第一条匹配记录,无匹配时返回None,不会抛错 test_one = Choice.choices.filter(question_id=6).first() - 如果需要写字符串形式的原生查询条件,必须用
Q对象包裹后再传入,不能直接传裸字符串from django.db.models import Q test = Choice.choices.get(Q(question_id=6))
内容的提问来源于stack exchange,提问作者jarjarbinks99
相关产品推荐
相关产品推荐

