Django使用字典推导式过滤模型时触发exact lookup错误如何解决
问题根源
你调用Card.objects.filter(device=device)时传入的device参数本身是一个未执行的多结果QuerySet对象,而Django的精确匹配=查询要求右值为单个值(模型实例、主键、基础类型值),直接传入多结果QuerySet就会触发该报错。
错误和你后续的字典推导式、字典值为列表的写法完全无关,你排查时发现遍历cards就报错也印证了问题出在查询语句本身。
排查步骤
- 打印
device变量的类型和值确认问题:print(type(device), device),如果输出类型为django.db.models.query.QuerySet即可定位问题 - 回溯
device变量的赋值逻辑,大概率是你之前用了filter查询赋值但没有取单个结果
修复方案
分两种使用场景选择修复方式:
- 你预期只查询单个设备关联的Card
给device变量赋值时取单个结果即可:
# 原错误赋值写法示例 device = Device.objects.filter(设备标识="xxx") # 修改为取第一个匹配结果 device = Device.objects.filter(设备标识="xxx").first() # 若确定匹配结果唯一,也可以用get查询 device = Device.objects.get(设备标识="xxx")
修改后再执行Card.objects.filter(device=device)即可正常返回QuerySet,后续遍历和字典推导式都可以正常运行。
2. 你预期查询多个设备关联的Card
将查询条件改为__in查询即可匹配QuerySet内的所有设备:
cards = Card.objects.filter(device__in=device)
内容的提问来源于stack exchange,提问作者Zaid Al Shattle
相关产品推荐
相关产品推荐

