Django使用values()获取QuerySet后迭代取值报AttributeError如何解决
错误原因
Django ORM的values()方法返回的QuerySet中每个元素是字典类型,并非模型类的实例对象,所以不支持.属性名的访问方式,只能通过字典键来取值。
正确实现方案
方案1:直接按字典键取值
适合已经用了values()的场景,直接用中括号加键名访问即可:
vmware = Vmware.objects.values('pk', 'hostname') for i in vmware: # 字典通过[key]方式取值 print(i['pk'], i['hostname'])
方案2:改用values_list+命名元组实现点属性访问
如果更习惯用.属性名的写法,可以把values()换成values_list(),加上named=True参数返回命名元组:
# named=True会返回带字段名的命名元组,支持点访问 vmware = Vmware.objects.values_list('pk', 'hostname', named=True) for i in vmware: print(i.pk, i.hostname)
方案3:查询模型实例(适合需要用到模型其他方法/属性的场景)
如果后续需要用到该模型的自定义方法或者其他未查询的字段,可以用only()方法指定仅查询需要的字段,返回模型实例:
# only()会只拉取指定字段,返回模型实例,支持点属性访问 vmware = Vmware.objects.only('pk', 'hostname') for i in vmware: print(i.pk, i.hostname)
内容的提问来源于stack exchange,提问作者Lolm_47
相关产品推荐
相关产品推荐

