2010-03-25 56 views
0

我有以下的在我的模型:Django的调试错误

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

回答

2

1.选择单个项目

它看起来就像你正在试图获得一个对象。使用filter将返回一个QuerySet对象(就像在您的代码中发生的那样),其行为更像一个列表(并且您已经注意到,缺少name属性)。

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

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

您也可以使用objects.get方法来代替,它会返回一个对象(如果它不存在抛出异常):

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

的Django对查询集一些不错的文档,并且它可能是值得考虑看看吧:
Docs on using filters
QuerySet reference

2.检索具体领域

Django提供了deferonly方法,可以让你从数据库中选择特定的领域,而不是一下子取了一切。这些实际上并不妨碍字段被阅读;相反,它会懒惰地加载它们。 defer是一个“选入”模式,可让您指定应该延迟加载的字段。 only是“out-out” - 你称之为,只有你传递的字段会被加载。

因此,在你的榜样,你会想要做这样的事情:

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

虽然与你给的例子中那样简单的模型,我不会担心太多,在所有关于限制领域。

+0

感谢您的答复。我想说的是,例如: 从信息中选择名称;而不是做一个选择*从信息; 感谢您的回复 – Hulk 2010-03-25 05:36:39

+0

啊,我现在明白了。我已经更新了答案。 – ShZ 2010-03-25 05:43:01

+0

+1为指向文档的贴心,完整的答案。我们需要更多像这样的答案。 :-) – cethegeek 2010-03-25 14:48:01