2012-03-05 83 views
1

聲明:我是python和Django的新手,但擁有Drupal編程經驗。初學者:檢查查詢集結果

我在這裏以下教程(http://www.djangobook.com/en/2.0/chapter05/),但我通過

Publisher.objects.filter(name='Apress') 
[<Publisher: Apress>] 

困惑我明白,結果是Queryset對象,那麼如何在下列方法失敗時檢索地址(或主鍵)?

p = Publisher.objects.filter(name='Apress') 
a = p.address 
'QuerySet' object has no attribute 'address' 

謝謝!

回答

3

這些屬性僅在模型實例上可用。 A QuerySet與模型實例列表一樣簡單,因此您必須以某種方式「解壓」它以獲取特定實例,然後獲取該實例的屬性。

如果你知道,這裏只有你查詢的事情之一,你應該使用get,而不是過濾器:

publisher = Publisher.objects.get(name='Apress') 
print publisher.address 

但是,如果返回多個匹配,這將引發一個MultipleObjectsReturned例外,相反,如果找不到匹配,則會引發ObjectDoesNotExist異常。因此,在使用get時需要小心,並確保將代碼包裝在合適的try...except區塊中。

如果你正在處理,你希望不止一個結果的東西,那麼你可以使用某種類型的循環結構中QuerySet處理各個項目:

for publisher in Publisher.objects.all(): 
    print publisher.address 

或者,直接拉你可以用傳統清單列出一個項目:

first_publisher = Publisher.objects.all()[0] 
print first_publisher.address 
+0

非常好的細節Chris。非常感謝! – 2012-03-05 23:03:10

+0

我覺得這個答案比我的更多細節更好!醇厚的黃色我認爲你可以接受它!蜱! :) – 2012-03-05 23:06:50

2

也許你需要調用get函數:

p = Subject.objects.get(name='Apress') 
+0

感謝Thanasis。這工作。我害怕使用get(),因爲它需要返回單個結果。 「如果沒有匹配查詢的結果,get()將引發DoesNotExist異常。」所以,我想objects.all()或objects.filter()會產生* list *的對象(假設有多個匹配),而get則返回單個對象。 – 2012-03-05 23:01:32

+1

你可以添加一個try塊來捕獲可能拋出的異常。你可以在這裏找到更多的信息:http://wiki.python.org/moin/HandlingExceptions – 2012-03-05 23:04:44

1

你查詢集基本上是一個列表,所以你需要循環的每個項目,以訪問其address屬性。事情是這樣的:如果你按照上面,因爲使用get回報您只有一個對象@Thanasis的意見

for p in Publisher.objects.filter(name='Apress'): 
    # access p.address here 

你的語法會工作。

+0

謝謝阿比德! – 2012-03-05 23:02:02