You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django遍历RawQuerySet报can't adapt type 'dict'错误如何解决?

错误产生原因

这个错误的触发时机不是遍历RawQuerySet的环节,而是raw()方法执行SQL传参时的参数类型不匹配:
Django调用raw()执行原生SQL时,会将传入的动态参数交给数据库驱动转换为SQL可识别的类型,而数据库驱动无法直接适配dict类型的参数值,因此抛出该错误。RawQuerySet是懒加载对象,只有遍历的时候才会真正执行SQL,因此错误会在遍历阶段被抛出。
常见错误传参场景:

  1. 使用%s占位符时,把dict作为单个参数值塞到了参数序列里,示例:
# 错误写法
books.objects.raw("SELECT * FROM books WHERE id = %s", [{"id": 1}])
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 17:06:04