【问题标题】:Django debug errorDjango 调试错误
【发布时间】:2010-03-25 05:22:23
【问题描述】:

我的模型中有以下内容:

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

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    1.选择单个项目

    看起来您正在尝试获取单个对象。使用filter 将返回一个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
    QuerySet reference

    2。检索特定字段

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

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

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

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

    【讨论】:

    • 感谢您的回复。我的意思是例如:从信息中选择名称;而不是从信息中选择 *;感谢回复
    • +1 表示指向文档的周到、完整的答案。我们需要更多这样的答案。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2021-07-16
    • 2011-01-03
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多