Django遍历RawQuerySet报can't adapt type 'dict'错误如何解决?
错误产生原因
这个错误的触发时机不是遍历RawQuerySet的环节,而是raw()方法执行SQL传参时的参数类型不匹配:
Django调用raw()执行原生SQL时,会将传入的动态参数交给数据库驱动转换为SQL可识别的类型,而数据库驱动无法直接适配dict类型的参数值,因此抛出该错误。RawQuerySet是懒加载对象,只有遍历的时候才会真正执行SQL,因此错误会在遍历阶段被抛出。
常见错误传参场景:
- 使用
%s占位符时,把dict作为单个参数值塞到了参数序列里,示例:
# 错误写法 books.objects.raw("SELECT * FROM books WHERE id = %s", [{"id": 1}])
- 错误将字典嵌套在序列里传递给命名参数,而非直接传递字典作为参数。
解决方案
- 如果你使用
%s位置占位符,参数列表内只能传入数据库可识别的基础类型(int、str、bool、float等),不能传入dict、list等复杂类型:
# 正确写法 books.objects.raw("SELECT * FROM books WHERE id = %s AND category = %s", [1, "科幻"])
- 如果你要使用字典传参,要将SQL占位符修改为
%(key)s的命名格式,直接将字典作为第二个参数传入,不要嵌套在序列中:
# 正确写法 books.objects.raw("SELECT * FROM books WHERE id = %(id)s AND category = %(cate)s", {"id":1, "cate":"科幻"})
- 如果没有动态参数,不要额外传入第二个参数,避免传入无效的dict对象。
- 示例代码中
books.ojects.raw存在拼写错误,正确写法为books.objects.raw,排查参数时可同步校验拼写问题。
内容的提问来源于stack exchange,提问作者Chowa C
相关产品推荐
相关产品推荐

