2010-03-25 51 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