0

我的模型中有以下内容:

 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.还如何只查询一个字段而不是选择所有字段,例如从信息中选择名称。

4

1 回答 1

2

1. 选择单品

看起来您正在尝试获取单个对象。Usingfilter将返回一个QuerySet对象(正如您的代码中发生的那样),它的行为更像一个列表(并且,正如您所注意到的,缺少该name属性)。

您在这里有两个选择。首先,你可以抓住第一个元素:

info_l = info.objects.filter(id=1)[0]

您也可以改用该objects.get方法,该方法将返回单个对象(如果不存在则引发异常):

info_l = info.objects.get(id=1)

Django 有一些关于 QuerySets 的非常好的文档,可能值得一看:
Docs on using filters
QuerySetreference

2. 检索特定字段

Django 提供了deferandonly方法,可以让你从数据库中选择特定的字段,而不是一次获取所有内容。这些实际上并不能阻止读取字段;相反,它会懒惰地加载它们。 defer是一种“选择加入”模式,可让您指定应延迟加载的字段。 only是“out-out”——你称之为,只有你传递的字段才会被热切加载。

所以在你的例子中,你想做这样的事情:

info_l = info.objects.filter(id=1).only('name')[0]

尽管使用像您提供的示例一样简单的模型,但我一点也不担心限制字段。

于 2010-03-25T05:33:08.230 回答