我的模型中有以下内容:
class info(models.Model):
add = models.CharField(max_length=255)
name = models.CharField(max_length=255)
当我说时,在观点中 info_l = info.objects.filter(id = 1) logging.debug(info_l.name)
我收到错误,说调试语句中不存在名称。 'QuerySet'对象没有属性'name' 1.如何解决这个问题。 2.另外如何仅查询一个字段而不是从信息中选择所有类似的选择名称。
答案 0 :(得分:2)
<强> 1。选择单个项目
看起来你正试图获得一个对象。使用filter
将返回QuerySet
对象(正如您的代码中所发生的那样),其行为更像列表(并且,正如您所注意到的,缺少name
属性)。< / p>
这里有两种选择。首先,你可以抓住第一个元素:
info_l = info.objects.filter(id=1)[0]
您也可以使用objects.get
方法,它将返回单个对象(如果不存在则引发异常):
info_l = info.objects.get(id=1)
Django在QuerySets上有一些相当不错的文档,值得看一看:
Docs on using filters
QuerySet
reference
<强> 2。检索特定字段
Django提供了defer
和only
方法,可以让您从数据库中选择特定字段,而不是一次提取所有内容。这些实际上并不会阻止字段被读取;相反,它懒洋洋地加载它们。 defer
是一种“选择加入”模式,可让您指定应该延迟加载哪些字段。 only
是“out-out” - 你打电话给它,只有你传递的字段才会被急切地加载。
所以在你的例子中,你想要做这样的事情:
info_l = info.objects.filter(id=1).only('name')[0]
虽然使用的模型与您给出的示例一样简单,但我不会担心限制字段。